基礎資料結構演算法 二叉樹的恢復和非遞迴遍歷

2021-08-03 21:59:11 字數 2199 閱讀 6630

我把二叉樹的恢復和遍歷寫在一起了,剛好恢復完之後就能遍歷,上資料結構實驗課的小夥伴有福了。

二叉樹的恢復一定要中序序列,然後先序序列或後序序列的隨便乙個,其實原理都一樣。

對於先序來說,第乙個元素是樹的根節點,重點來了,用這個節點去分割中序序列。(設該節點在中序序列中的位置為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的重點都處在這上面。真行不容易啊,並且很容易檢測出乙個人的實力到底如何。不要把二叉樹想的很複雜,其實就是鍊錶的公升級版 畢竟學渣,認識的太膚淺了,沒事,反正是寫給自己看的 汗 二叉樹的鏈式儲存結構 既然是鏈式,那麼無非就是使用鍊錶的形式進行...