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