二叉樹的基本操作

2021-10-03 12:16:36 字數 3358 閱讀 3378

因為個人對於二叉樹的操作有些地方理解的還不是很到位,所以本篇文章來總結一下二叉樹的一些基本操作。那麼二叉樹的相關概念,這裡就不再贅述。(本文用的是鏈式結構表示二叉樹

結點資訊

struct treenode

};

通過前序和中序遍歷序列建立二叉樹

大題步驟:

1.從前序中找出根節點數值,建立乙個結點。

2.在中序中找出根節點的下標,以此下標為分界線,左邊為左子樹,右邊為右子樹。

3.分別拿出左子樹的前序和中序,右子樹的前序和中序。

4.繼續執行上述操作,知道前序遍歷序列為空。

int

find

(vector<

int>

& post,

int res)

//找結點位置

return-1

;}vector<

int>

copy

(const vector<

int> res,

int left,

int right)

//區分左右子樹前中序列。

return v;

} treenode*

buildtree

(vector<

int>

& pre, vector<

int>

& post)

//方法一,時間複雜度太高

//方法2,時間複雜度較低

//root為本次根結點在preorder中的下標。

//start,end表示每次正在inorder中遍歷根結點的範圍。

treenode*

buildtree

(vector<

int>

& preorder, vector<

int>

& inorder)

treenode*

build

(vector<

int>

& preorder, vector<

int>

& inorder,

int root,

int start,

int end)

由於後序與中序建立二叉樹與前面方法基本相同,此處不再講解了。

參考部落格:

通過前序構建二叉樹

我們知道前序遍歷是根-》左-》右,所以我們先從前序序列開頭取數字,建立結點,先鏈結到左孩子上,當值為『#』說明,返回。進行鏈結右孩子。

treenode*

createbintree

(const string &str)

先序遍歷

先序的次序是:根-》左孩子-》右孩子

(1)遞迴實現

void

preorder

(treenode* root)

//先序

}

(2)非遞迴實現

我們用乙個棧來實現,因為順序為根、左、右,所以優先訪問根節結點,再訪問能左節點,最後右結點。對於任意乙個結點都可以看作為根節點,因此可以直接訪問,訪問結束後,若左子樹有值,按相同規律訪問左子樹。當訪問左子樹,再訪問右子樹。

大體過程:

1.先將根節點入棧

2.判斷棧中是否有值,有值取棧頂元素訪問以及出棧,將出棧的右子節點入棧。

3.重複2操作,直到棧為空。

void

preorder

(treenode* root)

}

中序遍歷

(1)遞迴實現

void

midorder

(treenode* root)

//中序

}

(2)非遞迴實現

依舊是使用棧,中序遍歷的順序為:左-》根-》右,所以先將所有的左節點入棧,直到左節點為空,取棧頂訪問元素,出棧。將出棧元素的右節點入棧(因為只要此時的出棧元素有右結點,說明出棧元素為根,所以接下來就是對右結點進行操作),繼續進行之前操作。

大體步驟:

1.若根節點左孩子不為空,迴圈將根節點以及根節點的所有左孩子壓入棧。

2.取棧頂元素,訪問棧頂元素以及出棧,對棧頂元素的右結點進行1操作。

3.直到cur和棧為空,則遍歷完成。

void

midorder

(treenode* root)

cur=s.

top();

cout<>val<<

" ";

s.pop();

cur=cur-

>right;

}}

後序遍歷

(1)遞迴實現

void

postorder

(treenode* root)

//後序

}

(2)非遞迴實現

依舊使用棧來實現,後序遍歷的順序是:左-》右-》根。因此先將所有左節點全部入棧,當左節點為空時,取棧頂元素訪問並出棧,此時不能繼續取棧頂元素(之前棧頂結點的父節點),因為我們不知道此時右子樹是否被訪問過,所以就需要乙個指標pre來標記是否被訪問過,若此時pre指向右節點說明已經被訪問,否則,則沒有被訪問,將左子樹壓棧進行之前的操作。直到棧空為止。

void

postorder

(treenode* root)

//後序

cur = s.

top();

if(!(cur-

>right)

||pre == cur-

>right)

//若此節點的右節點為空或者已經訪問過,則訪問此節點

else

}}

參考:

1.n層二叉樹的第n層最多有2^(n-1)個結點。

2.二叉樹節點計算公式 n = n0+n1+n2,度為0的葉子節點比度為2的節點數多乙個。

3.對任何一棵二叉樹t,如果其終端節點數為n0,度為2的節點數為n2,則n0=n2+1。

4.具有n個節點的完全二叉樹的深度為log2(n) + 1。

5.n個結點的二叉樹,一共可以生成((2n)!)/(n! * (n+1)!)種樹。

6.深度為k的二叉樹,至多有2^k-1個結點。

參考:參考

二叉樹基本操作

tree.h ifndef tree h define tree h include typedef int element 定義二叉樹 typedef struct nodetreenode void preorder treenode root 遞迴前序遍歷 void inorder treen...

二叉樹基本操作

一.二叉樹的定義 二.二叉樹的建立 定義一棵無資料的二叉樹 6 int left size 7 int right size 為了操作簡便,我們定義一棵不需要儲存資料的二叉樹,只要能儲存節點之間的邏輯關係就行,所以用兩個陣列來表示。left i 第i個節點的左子節點的序號 right i 第i個節點...

二叉樹基本操作

include include define maxsize 100 typedef char elemtype typedef struct node btnode void createbtnode btnode b,char str 由str串建立二叉鏈 j ch str j btnode f...