1. 二叉樹 定義結點型別
typedef struct nodetnode;
2. 二叉樹的先序遍歷:根節點——左子樹——右字樹
遞迴遍歷:
voidpreorder(tnode* root)
非遞迴遍歷:先序遍歷時,每當我們壓入乙個結點,我們壓入結點前對其進行訪問
void preorder(tnode *root)now=s.top();
s.pop();
now=now->rchild;
}cout
<}
3. 二叉樹的中序遍歷:左子樹——根節點——右字樹
遞迴遍歷:
void inorder(tnode*root)
非遞迴遍歷:中序時我們需要在遍歷完左子樹後訪問根節點,再去遍歷右子樹
void inorder(tnode *root)now=s.top();
cout
->";
s.pop();
now=now->rchild;
}cout
<}
4. 後序遍歷:左子樹——右字樹——根節點
遞迴遍歷:
void postorder(tnode*root)
非遞迴遍歷:後序遍歷時由於訪問完左右子樹後才能訪問根結點,因此需要將根結點在棧內保留到左右子樹被訪問後,但同時會出現乙個問題,當右子樹彈出後遇到根結點又會將右子樹結點壓入棧中,造成死迴圈,因此我們需要在定義乙個變數last代表最後乙個訪問的結點,當last與棧頂結點的右子樹結點相同時,則不再將右子樹結點壓入棧中。
void postorder(tnode *root)now=s.top();
if(now->rchild && last!=now->rchild)
now=now->rchild;
else
if(now->rchild ==null || last ==now->rchild)
}}
5. 給定中序和前序,求層序(後序都是一樣的,主要是建樹的過程)。
首先我們在上面介紹了前序,中序,後序遍歷的特性。所以我們基本的思路就是先找到當前樹的根節點,然後劃分為左子樹,右子樹,然後進入左子樹重複上面的過程,然後進入右子樹重複上面的過程。最後就可以還原一棵樹了。給個例子介紹一下:
前序遍歷: gdafemhz
中序遍歷: adefghmz
畫樹求法:
第一步,根據前序遍歷的特點,我們知道根結點為g
第二步,觀察中序遍歷adefghmz。其中root節點g左側的adef必然是root的左子樹,g右側的hmz必然是root的右子樹。
第三步,觀察左子樹adef,左子樹的中的根節點必然是大樹的root的leftchild。在前序遍歷中,大樹的root的leftchild位於root之後,所以左子樹的根節點為d。
第四步,同樣的道理,root的右子樹節點hmz中的根節點也可以通過前序遍歷求得。在前序遍歷中,一定是先把root和root的所有左子樹節點遍歷完之後才會遍歷右子樹,並且遍歷的左子樹的第乙個節點就是左子樹的根節點。同理,遍歷的右子樹的第乙個節點就是右子樹的根節點。
#include #include#include
#include
#include
#include
#include
#include
using
namespace
std;
typedef
long
long
ll;const
int inf=0x3f3f3f3f
;const
int maxn=50
;int
n,m,s,d;
inta[maxn],b[maxn];
struct
node
node[maxn];
int buildtree(int la,int ra,int lb,int
rb)void bfs(int
root)
int len=v.size();
for(int i=0;i)
printf(
"%d%c
",v[i],i==len-1?'
\n':'');
return;}
intmain()
6. 給後序和中序遍歷,求層序遍歷。
思路和上面是一樣的,主要是掌握建樹的過程。
#include #include#include
#include
#include
#include
#include
#include
using
namespace
std;
typedef
long
long
ll;const
int inf=0x3f3f3f3f
;const
int maxn=50
;int
n,m,s,d;
inta[maxn],b[maxn];
struct
node
node[maxn];
int buildtree(int la,int ra,int lb,int
rb)void bfs(int
root)
int len=v.size();
for(int i=0;i)
printf(
"%d%c
",v[i],i==len-1?'
\n':'');
return;}
intmain()
7. 給定二叉樹,給出s型列印:
voids_levelorderprint(treenode t)
}else}}
}
根據兩種二叉樹遍歷方式,求二叉樹方法
如何根據已知兩種遍歷的序列,求原始的二叉樹?並不是已知道任意兩個序列都可以還原二叉樹,只有知道先序中序以及中序和後序兩種型別的遍歷順序才能還原二叉樹。只知道先序和後序是還原不了原始的二叉樹的。1 已知道先序和中序遍歷,還原二叉樹。已知道二叉樹的先序遍歷為abcdefgh,中序遍歷為bdceafhg,...
已知兩種遍歷序列求原始二叉樹
思路 先序裡面,最先出現的是根節點,所以a就是根節點 中序裡面,根節點a在中間,所以a的左邊bdce是左子樹,a的右邊fhg是右子樹 先序裡面,a的左子樹b最先出現,所以b是左子樹的根節點 中序裡面,根節點b的左邊沒有結點,所以b的左子樹為空,即dce是b的右子樹 先序裡面,b的右子樹c最先出現,所...
二叉樹的兩種遍歷方法
二叉樹的遍歷有兩種方式,一種是遞迴遍歷,另一種是非遞迴遍歷。前一種方法從形式上很好理解,在這裡不再過多的談論,直接上 二叉樹的建立 定義並通過層序生成一棵二叉樹 typedef struct bitreebitree bitree creatbitree bitree con max int idx...