我把二叉樹的恢復和遍歷寫在一起了,剛好恢復完之後就能遍歷,上資料結構實驗課的小夥伴有福了。
二叉樹的恢復一定要中序序列,然後先序序列或後序序列的隨便乙個,其實原理都一樣。
對於先序來說,第乙個元素是樹的根節點,重點來了,用這個節點去分割中序序列。(設該節點在中序序列中的位置為i)
那麼對中序序列來說i左邊的為左子樹,i右邊得為右子樹。然後找出先序序列中的左右子樹,遞迴的進行這步操作即可,
詳細的看**一目了然(函式前面有注釋)。
我這裡有乙個簡單的方法實現先序後序中序的非遞迴遍歷。
以往我們實現層次遍歷的時候要借助乙個鍊錶(佇列也行 這裡為了保證都先序中序後序遍歷的一致性)
把首元素壓入煉表頭,當鍊表非空使輸出結果,如果有左右子樹就把左右子樹壓入最後乙個元素的後面,輸出完之後把改元素刪除。
這裡的先序中序後序遍歷也是一樣。
只不過不是遇到元素就輸出,而是先把左右子樹的位置放好,比如對先序來說,他要把他的左右子樹插到第乙個元素的後面。
然後在輸出,輸出完之後刪除,這時第乙個元素變成了他的左子樹(如果有的話),對左子樹進行一樣的操作,當鍊表為空時結束。
中序遍歷的話是把左子樹插到第乙個元素的前面,把右子樹插到他的後面。(具體操作看**,稍微有點技巧)
後序遍歷的話是把左右子樹插到第乙個元素的前面。
這裡要用到鍊錶的插入操作,由於插入和刪除都是在表頭處,所以時間複雜度和遞迴的一致,但是效率比遞迴更高,因為不要用到大量工作棧。
具體的細節問題看**,單個的功能函式並不長,只不過我把他寫到一起去了,可以直接看單個函式。
#include#include#includeusing namespace std;
typedef struct node
node;
vectorpre;//先序序列
vectormid;//中序序列
vectorpos;//後序序列
//先序加中序恢復二叉樹
void premidrecover(node* &t,int a,int b,int x,int y)
else t->left=null;
if(i+1<=y)
else t->right=null;
return ;}}
} //後序加中序恢復二叉樹
void posmidrecover(node* &t,int a,int b,int x,int y)
else t->left=null;
if(i+1<=y)
else t->right=null;
return ;}}
} //先序非遞迴遍歷
void previsit(node *t)
}}
//後序非遞迴遍歷
void posvisit(node *t)
{ listseq;
seq.push_back(*t);
while(!seq.empty())
{node &e=seq.front();
if(e.left==null&&e.right==null)
{coutseq.push_back(*t);
while(!seq.empty())
{node e=seq.front();
if(e.left!=null)
seq.push_back(*e.left);
if(e.right!=null)
seq.push_back(*e.right);
cout<>n;
pre.resize(n);
mid.resize(n);
cout<<"輸入先序序列:"<>pre[i];
cout<<"輸入中序序列:"<>mid[i];
node *head1=new node;
premidrecover(head1,0,pre.size()-1,0,mid.size()-1);
cout<<"先序非遞迴遍歷結果為:"<>n;
pos.resize(n);
mid.resize(n);
cout<<"輸入後序序列:"<>pos[i];
cout<<"輸入中序序列:"<>mid[i];
node *head2=new node;
posmidrecover(head2,0,pos.size()-1,0,mid.size()-1);
cout<<"先序非遞迴遍歷結果為:"<
資料結構和演算法 二叉樹
二叉樹 樹的每個節點最多只能有兩個子節點。樹的效率 查詢節點的時間取決於這個節點所在的層數,每一層最多有2n 1個節點,總共n層共有2n 1個節點,那麼時間複雜度為o logn 底數為2。二叉搜尋樹要求 若它的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值 若它的右子樹不空,則右子樹上所有結...
資料結構和演算法 二叉樹基礎(下)二叉查詢樹
二叉查詢樹顧名思義,他是為了快速查詢而生的,不過他除了快速查詢,還支援快速插入,快速刪除,這些都依賴於二叉查詢樹的特殊結構 二叉查詢樹要求,在樹中任意乙個節點,其左子樹的每個節點都要小於這個節點值,其右子樹的每個節點都要大於這個節點的值如下圖 二叉樹查詢 如何在二叉查詢樹中查詢乙個資料呢?首先我麼你...
資料結構 二叉樹基礎
資料結構真心不是蓋的啊!現在覺得為什麼公司面試和筆試,1 3的重點都處在這上面。真行不容易啊,並且很容易檢測出乙個人的實力到底如何。不要把二叉樹想的很複雜,其實就是鍊錶的公升級版 畢竟學渣,認識的太膚淺了,沒事,反正是寫給自己看的 汗 二叉樹的鏈式儲存結構 既然是鏈式,那麼無非就是使用鍊錶的形式進行...