建立二叉樹:層次遍歷--樹的寬度高度,後序遍歷--祖先節點
建立二叉樹,遍歷二叉樹.詳細介紹了層次遍歷和後序遍歷的應用.
層次遍歷:樹的高度,樹的寬度,每一層節點個數等
後序遍歷:根節點到某節點的路徑,兩個節點的最近公共祖先等
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]BinaryTreeLevelOrderTraversal(二叉樹的層次遍歷)二叉樹
- 二叉樹的先中後序遍歷二叉樹
- 二叉樹的先,中,後序遍歷二叉樹
- 二叉樹的前中後序遍歷二叉樹
- LeetCode102.二叉樹的層序遍歷LeetCode二叉樹
- 二叉樹的按層遍歷二叉樹
- 二叉樹的四種遍歷方法:先序,中序,後序,層序二叉樹
- [Leetcode]102.二叉樹的層次遍歷LeetCode二叉樹
- 二叉搜尋樹的後序遍歷序列
- 根據二叉樹的前序遍歷和中序遍歷輸出二叉樹;二叉樹
- LeetCode-107-二叉樹的層序遍歷 IILeetCode二叉樹
- 中序線索二叉樹的建立與遍歷二叉樹
- 二叉樹中序和後序遍歷表示式二叉樹
- 二叉樹的前序、中序、後序三種遍歷二叉樹
- 【模板題】- 145. 二叉樹的後序遍歷二叉樹
- 二叉樹遍歷二叉樹
- 二叉樹---遍歷二叉樹
- 根據前序遍歷序列、中序遍歷序列,重建二叉樹二叉樹
- 二叉樹的遍歷二叉樹
- L2_006樹的遍歷(後序+中序->前序/層序)
- 二叉樹的前序,中序,後序遍歷方法總結二叉樹
- 通過層次遍歷計算二叉樹的層數二叉樹
- leetcode----給定一個二叉樹,返回該二叉樹由底層到頂層的層序遍歷,(從左向右,從葉子節點到根節點,一層一層的遍歷)LeetCode二叉樹
- 二叉樹排序樹的建立,遍歷和刪除二叉樹排序
- 二叉樹的後序遍歷post order演算法二叉樹演算法
- 採用層次遍歷判斷二叉樹為完全二叉樹二叉樹
- C++樹——遍歷二叉樹C++二叉樹
- 玩轉二叉樹(樹的遍歷)二叉樹
- 從中序與後序遍歷序列構造二叉樹二叉樹
- 二叉樹遍歷方法二叉樹
- 二叉樹遍歷 -- JAVA二叉樹Java