建立二叉樹:層次遍歷--樹的寬度高度,後序遍歷--祖先節點
建立二叉樹,遍歷二叉樹.詳細介紹了層次遍歷和後序遍歷的應用.
層次遍歷:樹的高度,樹的寬度,每一層節點個數等
後序遍歷:根節點到某節點的路徑,兩個節點的最近公共祖先等
package tree;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;
public class TreeADT {
private String data=null;
private TreeADT leftChild=null;
private TreeADT rightChild=null;
public TreeADT (String data){
this.data=data;
this.leftChild=null;
this.rightChild=null;
}
//建立一顆二叉樹
public void createBinTree(TreeADT root){
TreeADT newNodeB = new TreeADT ("B");
TreeADT newNodeC = new TreeADT ("C");
TreeADT newNodeD = new TreeADT ("D");
TreeADT newNodeE = new TreeADT ("E");
TreeADT newNodeF = new TreeADT ("F");
newNodeF.rightChild=new TreeADT("G");
root.leftChild=newNodeB;
root.rightChild=newNodeC;
root.leftChild.leftChild=newNodeD;
root.leftChild.rightChild=newNodeE;
root.rightChild.rightChild=newNodeF;
}
//訪問節點資料
public void visted(TreeADT subTree){
System.out.println(subTree.data);;
}
//前序遞迴遍歷
public void preOrder(TreeADT subTree){
if(subTree!=null){
visted(subTree);
preOrder(subTree.leftChild);
preOrder(subTree.rightChild);
}
}
//非遞迴,前序遍歷.
public void noPreOrder(TreeADT subTree){
Stack <TreeADT>stack=new Stack<TreeADT>();
TreeADT p=subTree;
while(!stack.empty()||p!=null){
if(p!=null){
visted(p);
stack.push(p);
p=p.leftChild;
}
else{
p=stack.pop();
p=p.rightChild;
}
}
}
//遞迴中序遍歷
public void inOrder(TreeADT subTree){
if(subTree!=null){
inOrder(subTree.leftChild);
visted(subTree);
inOrder(subTree.rightChild);
}
}
//非遞迴中序遍歷
public void noInOrder(TreeADT subTree){
Stack<TreeADT> stack=new Stack<TreeADT>();
TreeADT p=subTree;
while(p!=null||!stack.empty()){
if(p!=null){
stack.push(p);
p=p.leftChild;
}
else{
p=stack.pop();
visted(p);
p=p.rightChild;
}
}
}
//遞迴後序遍歷
public void postOrder(TreeADT subTree){
if(subTree!=null){
postOrder(subTree.leftChild);
postOrder(subTree.rightChild);
visted(subTree);
}
}
//非遞迴後序遍歷
public void noPostOrder(TreeADT subTree){
Stack<TreeADT>stack=new Stack<TreeADT>();
TreeADT p=subTree;
TreeADT r=null;
while(p!=null||!stack.empty()){
if(p!=null){
stack.push(p);
p=p.leftChild;
}
else{
p=stack.peek();
if(p.rightChild!=null&&p.rightChild!=r){
p=p.rightChild;
stack.push(p);
p=p.leftChild;
}
else{
p=stack.pop();
visted(p);
r=p;
p=null;
}
}
}
}
//層次遍歷
public void levelOrder(TreeADT subtree){
TreeADT p=subtree;
Queue <TreeADT>queue=new LinkedList<TreeADT>();//介面不能直接例項化,需要物件上轉型;queue是個介面,而stack是個類。。
queue.add(p);
while(!queue.isEmpty()){
p=queue.remove();//一定要儲存佇列的指標
visted(p);
if(p.leftChild!=null) queue.add(p.leftChild);
if(p.rightChild!=null) queue.add(p.rightChild);
}
}
//非遞迴實現樹的高度
public void high(TreeADT subTree){
int front=0;int rear=0;TreeADT[] Q=new TreeADT [20];int last=1;int level=0;
TreeADT p=subTree;
Q[++rear]=p;
while(front<rear){
p=Q[++front];
if(p.leftChild != null){
Q[++rear]=p.leftChild;
}
if(p.rightChild!=null){
Q[++rear]=p.rightChild;
}
if(front==last){
level++;
last=rear;
}
}
System.out.println(level);
}
//非遞迴實現求樹的每一層寬度
public void len(TreeADT subTree){
int front=0,rear=0,level=0,last=1,count[]=new int [10];TreeADT[]Q=new TreeADT[20];
count[0]=1;
TreeADT p=subTree;
Q[++rear]=p;
while(front<rear){
p=Q[++front];
if(p.leftChild!=null) {Q[++rear]=p.leftChild;count[level+1]++;}
if(p.rightChild!=null){Q[++rear]=p.rightChild;count[level+1]++;}
if(front==last){
level++;
last=rear;
}
}
for(int i=0;i<level;i++){
System.out.println(count[i]);
}
}
//遞迴實現樹的高度和寬度
public int iteratorHigh(TreeADT subTree){
TreeADT p=subTree;
if(p==null){
return 0;
}
else return iteratorHigh(p.leftChild)>iteratorHigh(p.rightChild)?1+iteratorHigh(p.leftChild):1+iteratorHigh(p.rightChild);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
TreeADT root =new TreeADT ("A");
root.createBinTree(root);
//root.inOrder(root);
//root.noInOrder(root);
//root.postOrder(root);
//root.noPostOrder(root);
root.levelOrder(root);
}
}
相關文章
- 二叉樹的建立、前序遍歷、中序遍歷、後序遍歷二叉樹
- 二叉樹建立,前序遍歷,中序遍歷,後序遍歷 思路二叉樹
- 層序遍歷二叉樹二叉樹
- 二叉樹的層序遍歷二叉樹
- 二叉樹--後序遍歷二叉樹
- 二叉樹的深度、寬度遍歷及平衡樹二叉樹
- 層序遍歷樹的節點,佇列實現佇列
- 144.二叉樹的前序遍歷145.二叉樹的後序遍歷 94.二叉樹的中序遍歷二叉樹
- 二叉樹:構造二叉樹(通過前序和中序遍歷)、映象翻轉、層次遍歷二叉樹
- 二叉樹的廣度遍歷和深度遍歷()二叉樹
- 二叉樹的先,中,後序遍歷二叉樹
- 二叉樹的先中後序遍歷二叉樹
- 二叉樹的前中後序遍歷二叉樹
- 資料結構與演算法——二叉樹的前序遍歷,中序遍歷,後序遍歷資料結構演算法二叉樹
- python-二叉樹:前、中、後、層序遍歷Python二叉樹
- 二叉樹的按層遍歷二叉樹
- 二叉樹的四種遍歷方法:先序,中序,後序,層序二叉樹
- 根據二叉樹的前序遍歷和中序遍歷輸出二叉樹;二叉樹
- 二叉樹的建立與遍歷二叉樹
- LintCode 前序遍歷和中序遍歷樹構造二叉樹二叉樹
- 二叉樹中序和後序遍歷表示式二叉樹
- 中序線索二叉樹的建立與遍歷二叉樹
- 二叉樹的前序、中序、後序三種遍歷二叉樹
- 二叉樹---遍歷二叉樹
- 二叉樹遍歷二叉樹
- 二叉樹的遍歷二叉樹
- 根據前序遍歷序列、中序遍歷序列,重建二叉樹二叉樹
- 通過層次遍歷計算二叉樹的層數二叉樹
- 3143 二叉樹的序遍歷二叉樹
- 二叉樹的前序,中序,後序遍歷方法總結二叉樹
- 二叉樹排序樹的建立,遍歷和刪除二叉樹排序
- 二叉樹的深度優先遍歷和廣度優先遍歷二叉樹
- 採用層次遍歷判斷二叉樹為完全二叉樹二叉樹
- Javascript樹(一):廣度遍歷和深度遍歷JavaScript
- C++樹——遍歷二叉樹C++二叉樹
- 二叉樹的後序遍歷post order演算法二叉樹演算法
- 【模板題】- 145. 二叉樹的後序遍歷二叉樹
- 二叉樹遍歷方法二叉樹