二叉樹的遞迴遍歷比較簡單,這裡就不聊了。今天主要聊聊二叉樹的非遞迴遍歷,主要借助於「棧」後進先出的特性來儲存節點的順序,先序遍歷和中序遍歷相對來說比較簡單,重點理解後序遍歷。
1. 先看看節點型別:
//二叉樹的節點型別
private class node
}
2.先序遍歷。非遞迴先序遍歷的思路如下:
1.先將根節點入棧
2.訪問根節點
3.如果根節點存在右孩子,則將右孩子入棧
4.如果根節點存在左孩子,則將左孩子入棧(注意:一定是右孩子先入棧,然後左孩子入棧)
5.重複2-4
public void preorder(node root)
node tmp=root;
stacks=new stack();
s.push(tmp); //根節點入棧
while(!s.empty())
//3.如果根節點存在左孩子,則將左孩子入棧
if(p.leftchild!=null)
} system.out.println();
}
3.中序遍歷。 非遞迴中序遍歷的思路如下:
1.先將根節點入棧
2.將當前節點的所有左孩子入棧,直到左孩子為空
3.訪問棧頂元素,如果棧頂元素存在右孩子,則繼續第2步
4.重複第2、3步,直到棧為空並且所有的節點都被訪問
public void inorder(node root)
node tmp=root;
stacks=new stack();
while(tmp!=null || !s.empty())
//3.訪問棧頂元素
tmp=s.pop();
system.out.print(tmp.data+" ");
//4.如果棧頂元素存在右孩子,則將右孩子賦值給tmp,也就是將右孩子入棧
if(tmp.rightchild!=null)
//否則,將tmp置為null,表示下次要訪問的是棧頂元素
else
} system.out.println();
}
4.後序遍歷。 後續遍歷的非遞迴實現思路:
1.根節點入棧
2.將根節點的左子樹入棧,直到最左,沒有左孩子為止
3.得到棧頂元素的值,先不訪問,判斷棧頂元素是否存在右孩子,如果存在並且沒有被訪問,則將右孩子入棧,否則,就訪問棧頂元素
public void postorder(node root)
node tmp=root; //當前節點
node prev=null; //上一次訪問的節點
stacks=new stack();
while(tmp!=null || !s.empty())
if(!s.empty())
//4.存在沒有被訪問的右孩子
else
}} system.out.println();
}
二叉樹遞迴 非遞迴遍歷(Java實現)
遍歷是對一顆二叉樹最基本的操作,有前序遍歷 中序遍歷 後序遍歷和層次遍歷四種,都可以通過遞迴或者資料結構實現。假定葉子結構如下 static classleaf publicstring tostring 1.前序遍歷 先訪問其根節點,再訪問其左節點,最後訪問其右節點。遞迴實現 先訪問其根節點,然後...
二叉樹遍歷(遞迴 非遞迴)
二叉樹以及對二叉樹的三種遍歷 先根,中根,後根 的遞迴遍歷演算法實現,以及先根遍歷的非遞迴實現。node public class node public node left public node right public object value 遍歷訪問操作介面 public inte ce ...
二叉樹非遞迴遍歷
二叉樹非遞迴遍歷的幾個要點 1 不管前序 中序還是後序,它們的遍歷路線 或者說是回溯路線,先沿左邊一直走到盡頭,然後回溯到某節點,並跳轉到該節點的右孩子 如果有的話 然後又沿著這個有孩子的左邊一直走到盡頭 都是一樣的。2 明確每次回溯的目的。比如,前序回溯的目的是為了訪問右子樹 中序回溯的目的是為了...