用遞迴的方法遍歷二叉樹很簡單,但是非遞迴的遍歷二叉樹就比較困難了。在非遞迴方法中,我們需要棧stack的幫助。以下是分別用遞迴方式和非遞迴方式寫的前、中、後序遍歷二叉樹的方法,經過驗證結果是正確的。
#include #include using namespace std;
struct node
;void insert(node* &p,int num)
if(numnum)
insert(p->pleft,num);
else if(num>p->num)
insert(p->pright,num);
else
return;
}void preorder(node* p)
}void inorder(node* p)
}void postorder(node* p)
}void preorderbyloop(node* p)
if(!mystack.empty()) //從棧中取出乙個節點的指標
}coutwhile(p!=null||!mystack.empty())
if(!mystack.empty())
}coutnode* pre=null; //剛剛訪問過的節點
while(p!=null||!mystack.empty())
p=mystack.top();
if(p->pright==null||p->pright==pre) //沒有右孩子 或者右孩子剛剛遍歷過了
else
p=p->pright;
} cout<
二叉樹三種遍歷方式 遞迴和非遞迴
樹形結構是一類重要的非線性資料結構。其中以樹和二叉樹是最為常用。二叉樹有四種遍歷順序 先序遍歷 前序遍歷 中序遍歷,後序遍歷,層序遍歷。這三種遍歷的方式其實是由遍歷的根結點的順序來定義的。先序遍歷 先訪問根結點,再遍歷它的左子樹,最後遍歷它的右子樹。中序遍歷 先遍歷左子樹,然後訪問根結點,最後遍歷它...
二叉樹的遍歷方式(遞迴 非遞迴)
二叉樹的前序 中序 後序遍歷方式,遞迴與非遞迴。層序遍歷的方式已經在之前的部落格中寫過 遞迴方式比較簡單。前序遍歷 void preorder treenode root 前序遍歷非遞迴 基本思路 利用棧。先輸出結點值,再入棧。然後遍歷左子樹。退棧時,遍歷棧頂結點的右子樹。void preorder...
二叉樹的遍歷 非遞迴方式
分別用非遞迴的方式實現二叉樹的先序遍歷 中序遍歷和後續遍歷 非遞迴方式實現二叉樹的先序遍歷。過程 1.申請乙個新的棧,記為stack,然後將二叉樹的頭結點head壓入stack中。2.從stack中彈出棧頂結點,記為cur,然後列印cur結點的值,再將結點cur的右孩子 不為空的話 先壓入stack...