樹的構建,遍歷和判斷

2021-09-29 16:19:06 字數 3930 閱讀 2889

# include

using

namespace std;

#include

#include

#include

typedef

struct node

*bitree,bitreenode;

//1.先序和中序建立樹

bitree preinorder

(char preord,

char inord,

int i,

int j,

int k,

int h)

//2.中序和後序

bitree behinorder

(char behord,

char inord,

int i,

int j,

int k,

int h)

bitree createbitree

(char preord,

char inord,

int n)

//3.非遞迴前序遍歷(先輸出,再進棧,遍歷左子樹完了到右邊)

void

prorder

(bitree bt)

else

} cout<

}//4.非遞迴中序遍歷(棧實現,先進棧,遍歷左子樹,出棧時輸出節點值,再遍歷右子樹,出棧輸出)

void

inorder

(bitree bt)

else

} cout<

}//5.非遞迴後序遍歷(入棧帶著標誌,當節點標誌為1,且沒有孩子輸出他)

void

beorder

(bitree bt)

else

//右子樹未訪問

else

//右子樹已訪問}}

cout<

}//6.非遞迴層次遍歷(利用佇列實現1.非空二叉樹的根節點指標入佇列2.隊頭元素出隊,並輸出,將該節點的左右孩子入隊)

void

levelorder

(bitree bt)

cout<

}//7.判斷是否是滿二叉樹(用層次遍歷做,每個節點都要左右孩子或者為葉節點)

bool

isfullbitree

(bitree bt)

else

if(p-

>lchild==

null

&&p-

>rchild==

null

)else

}return result;

}//8.判斷是否是完全二叉樹(用層次遍歷做1.可以只有左節點2.這個節點的雙親沒有右節點,它不能有左右孩子)

bool

iscompletebitree

(bitree bt)

}else

else

if(p-

>lchild!=

null

&&p-

>rchild==

null

)else

if(p-

>lchild==

null

&&p-

>rchild!=

null

)else}}

return result;

}//9.判斷是否是平衡二叉樹(用到了求樹深度的函式,左子樹為平衡樹,右子樹為平衡樹,左右子樹的高度相差不為1)

//(1)時間複雜度高,節點被重複訪問

inttreedepth

(bitree bt)

//求深度的函式

int left=

treedepth

(bt-

>lchild)

;int right=

treedepth

(bt-

>rchild)

;return

(left>right)

?(left+1)

:(right+1)

;}bool

isblanced

(bitree bt)

int left=

treedepth

(bt-

>lchild)

;int right=

treedepth

(bt-

>rchild)

;int diff=left-right;

if(diff>

1||diff

)return

isblanced

(bt-

>lchild)

&&isblanced

(bt-

>rchild);}

//(2)在每次遍歷的時候就求出節點的深度,這樣避免了重複訪問節點

bool

isbalanced2

(bitree bt,

int*depth)

int left,right;if(

isbalanced2

(bt-

>lchild,

&left)

&&isbalanced2

(bt-

>rchild,

&right)

)//左子樹和右子樹都是平衡樹

}return

false;}

intmain()

;//前

//char str2[40]=;//中

//char str3[40]=;//後

/*char str1[40]=;//前

char str2[40]=;//中

char str3[40]=;//後*/

char str1[40]

=;//前char str2[40]

=;//中char str3[40]

=;//後int n=

strlen

(str1)

; bitree root;

root=

createbitree

(str3,str2,n)

; cout<<

"前序:"

<

cout<<

"中序:"

<

cout<<

"後序:"

<

cout<<

"層次遍歷輸出"

<

levelorder

(root)

; cout<<

"前序遍歷輸出"

<

prorder

(root)

; cout<<

"中序遍歷輸出"

<

inorder

(root)

; cout<<

"後序遍歷輸出"

<

beorder

(root);if

(iscompletebitree

(root)

)else

cout<<

"不是完全二叉樹"

<

isfullbitree

(root)

)else

cout<<

"不是滿二叉樹"

<

isblanced

(root)

)else

cout<<

"不是平衡二叉樹"

<

int depth=0;

if(isbalanced2

(root,

&depth)

)else

cout<<

"不是平衡二叉樹,深度為:"

<

}

執行結果截圖:

菜鳥一枚,若有錯誤,歡迎大神指出哦!加油!

哈夫曼樹的構建及遍歷

哈夫曼樹是一棵怎樣的樹呢,假如我們給出一堆資料 1,2,3,4,5 資料對應的數字還代表這個數字出現的次數 來構建一顆二叉樹,怎樣一顆二叉樹才能使我們的查詢效率率最高呢,那就是哈夫曼樹了,在前面的 1,2,3,4,5 中,我們先選出兩個最小的,那就是 1,2 然後1和2構建乙個結點。該結點為3,左右...

根據樹的先序遍歷判斷中序遍歷

寫在前邊的話 本文如果有幫助到你,麻煩給博主乙個鼓勵的贊唄 一棵樹的前序遍歷序列為abcdefg,它的中序遍歷序列可能是 a.cabdefg b.abcdefg c.dacefbg d.adcfeg 有這樣乙個知識點,樹的前序序列對應入棧順序,中序遍歷對應出棧順序 這個結論的解釋可以點我檢視 那麼這...

樹的深度遍歷和廣度遍歷

樹的前序 中序 後序遍歷本質上都可以認為是深度遍歷。那樹的層序遍歷是什麼?總之先寫一下樹的前序遍歷的遞迴寫法和迭 法。遞迴寫法 public class solution list.add node.val if node.left null if node.right null return li...