劍指offer面試題 求二叉樹的深度

2021-07-17 03:49:19 字數 1761 閱讀 7569

題目:輸入一棵二叉樹的根結點,求該樹的深度。從根結點到葉結點依次經過的結點(含根、葉結點)形成樹的一條路徑,最長路徑的長度為樹的深度。例如下圖中的二叉樹的深度為4

,因為它從根結點到葉結點最長的路徑包含

4個結點(從根結點

1開始,經過結點

2和結點

5,最終到達葉結點7)。

解析:①如果一棵樹只有乙個結點,它的深度為1

;②如果根結點只有左子樹而沒有右子樹,那麼樹的深度應該是其左子樹的深度加1

;同樣如果根結點只有右子樹而沒有左子樹,那麼樹的深度應該是其右子樹的深度加1;

③如果既有右子樹又有左子樹,那該樹的深度就是其左、右子樹深度的較大值再加1。

在上圖的二叉樹中,根結點為1

的樹有左右兩個子樹,其左右子樹的根結點分別為結點2和

3。根結點為

2的左子樹的深度為

3,而根結點為

3的右子樹的深度為

2,因此根結點為

1的樹的深度就是4。

**實現:

int treedepth(binarytreenode* proot)

int nleft = treedepth(proot->m_pleft);

int nright = treedepth(proot->m_pright);

return (nleft > nright) ? (nleft + 1) : (nright + 1);

}

完整**及其測試用例實現:

#includeusing namespace std;

struct binarytreenode

;binarytreenode* createbinarytreenode(int value)

void connecttreenodes(binarytreenode* pparent, binarytreenode* pleft, binarytreenode* pright)

}void destroytree(binarytreenode* proot)

}int treedepth(binarytreenode* proot)

int nleft = treedepth(proot->m_pleft);

int nright = treedepth(proot->m_pright);

return (nleft > nright) ? (nleft + 1) : (nright + 1);

}// ********************測試**********************

void test(binarytreenode* proot, int expected)

else }

void test1()

void test2()

void test3()

void test4()

void test5()

int main()

執行結果:

test1 begin:test passed.

test2 begin:test passed.

test3 begin:test passed.

test4 begin:test passed.

test5 begin:test passed.

請按任意鍵繼續. . .

《劍指Offer》面試題 平衡二叉樹

題目 輸入乙個二叉樹的根節點,判斷該樹是不是平衡二叉樹。如果某二叉樹中任意節點的左右子樹的深度相差不超過1,那麼它就是一棵平衡二叉樹。思路 用後序遍歷實現 先遍歷節點的左右子樹,左右子樹都平衡才來判斷該節點是否平衡,如果左右子樹中有不平衡的,則直接返回false,避免了從上往下逐個節點地計算深度帶來...

劍指Offer 面試題 樹和二叉樹

題目描述 輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。基礎知識 在二叉樹的前序遍歷序列中,第乙個數字總是樹的根節點的值。在中序遍歷序列中,根節點的值在序列的中間,左子樹的節點的...

《劍指Offer》面試題 二叉樹的深度

題目描述 輸入一棵二叉樹,求該樹的深度。從根結點到葉結點依次經過的結點 含根 葉結點 形成樹的一條路徑,最長路徑的長度為樹的深度。思路 此題的遞迴思想比較簡單,直接用遞迴將根節點的深度轉換為求左右子孩子的深度的較大值 1,根節點的深度等於max 左孩子的深度,右孩子的深度 輸入 第一行輸入有n,n表...