劍指offer 學習筆記 二叉樹的深度

2021-10-04 18:08:53 字數 3914 閱讀 9269

面試題55:二叉樹的深度。

1.輸入一棵二叉樹,求該樹的深度。

只需遍歷整棵樹的每一條路徑找出最長的即可,以下**中的樹結構為:

// 左子樹長度

int* leftpreorderend = startpreorder + leftlength;

// 左子樹先序遍歷尾邊界

if(leftlength >0)

if(leftlength < endpreorder - startpreorder)

return root;

}binarytreenode*

construct

(int

* preorder,

int* inorder,

int length)

return

constructcore

(preorder, preorder + length -

1, inorder, inorder + length -1)

;}inttreedepth

(binarytreenode* proot)

int leftdepth =

treedepth

(proot-

>m_pleft)

;int rightdepth =

treedepth

(proot-

>m_pright)

;return

max(leftdepth, rightdepth)+1

;}intmain()

;int inorder=

; binarytreenode* proot =

construct

(preorder, inorder,

sizeof

(preorder)

/sizeof

(*preorder));

cout <<

"樹的深度為:"

<<

treedepth

(proot)

<< endl;

}2.輸入一棵二叉樹的根節點,判斷該樹是不是平衡二叉樹。如果某二叉樹中任意節點的左、右子樹的深度相差不超過1,那麼它就是一棵平衡二叉樹,上例的樹就是一棵平衡二叉樹。

我們可以根據題目1來求解,遍歷樹的每個節點,遍歷到每個節點時呼叫獲取樹的深度的函式來獲取節點的兩個子樹的深度:

bool

isbalanced

(binarytreenode* proot)

int leftdepth =

treedepth

(proot-

>m_pleft)

;int rightdepth =

treedepth

(proot-

>m_pright);if

(leftdepth - rightdepth >

1|| leftdepth - rightdepth

)return

isbalanced

(proot-

>m_pleft)

&&isbalanced

(proot-

>m_pright)

;}

但以上方法乙個節點會被遍歷多次,太慢了。我們可以通過後序遍歷來實現每個節點只遍歷一次,即從下向上地計算結果:

#include

using

namespace std;

struct binarytreenode

;binarytreenode*

constructcore

(int

* startpreorder,

int* endpreorder,

int* startinorder,

int* endinorder)

else

}int

* rootinorder = startinorder;

while

(rootinorder < endinorder &&

*rootinorder !=

*startpreorder)

if(rootinorder == endinorder &&

*rootinorder !=

*startpreorder)

int leftlength = rootinorder - startinorder;

// 左子樹長度

int* leftpreorderend = startpreorder + leftlength;

// 左子樹先序遍歷尾邊界

if(leftlength >0)

if(leftlength < endpreorder - startpreorder)

return root;

}binarytreenode*

construct

(int

* preorder,

int* inorder,

int length)

return

constructcore

(preorder, preorder + length -

1, inorder, inorder + length -1)

;}bool

isbalanced

(binarytreenode* proot,

int& depth)

int leftdepth =

0, rightdepth =0;

if(isbalanced

(proot-

>m_pleft, leftdepth)

&&isbalanced

(proot-

>m_pright, rightdepth))}

return

false;}

bool

isbalanced

(binarytreenode* proot)

intmain()

;int inorder=

; binarytreenode* proot =

construct

(preorder, inorder,

sizeof

(preorder)

/sizeof

(*preorder));

cout <<

(isbalanced

(proot)

?"是一棵平衡二叉樹"

:"不是平衡二叉樹"

)<< endl;

}

劍指offer 學習筆記 二叉樹的映象

面試題27 二叉樹的映象。輸入一棵二叉樹,該函式輸出它的映象。二叉樹的節點定義如下 struct binarytreenode 依次交換每個節點的兩個子樹即可 include using namespace std struct binarytreenode binarytreenode const...

劍指offer 二叉樹 二叉樹搜尋樹

package bst import j a.util.public class bst if pre.length 0 in.length 0 treenode root new treenode pre 0 for int i 0 i in.length i return root 判斷給定陣列...

劍指offer 二叉樹 二叉樹的映象

操作給定的二叉樹,將其變換為源二叉樹的映象。二叉樹的映象定義 源二叉樹 8 6 10 5 7 9 11 映象二叉樹 8 10 6 11 9 7 51,交換左右子樹 2,遞迴交換左右子樹的左右子節點 package offertest title mirror description author 田...