程式設計師面試題精選 判斷二叉樹是不是平衡的

2021-05-28 15:26:37 字數 1155 閱讀 4923

**何海濤日誌

題目:輸入一棵二叉樹的根結點,判斷該樹是不是平衡二叉樹。如果某二叉樹中任意結點的左右子樹的深度相差不超過1,那麼它就是一棵平衡二叉樹。例如下圖中的二叉樹就是一棵平衡二叉樹:

我們很容易就能想到乙個思路:在遍歷樹的每個結點的時候,呼叫函式treedepth得到它的左右子樹的深度。如果每個結點的左右子樹的深度相差都不超過1,按照定義它就是一棵平衡的二叉樹。

//判斷二叉樹是否為平衡二叉樹,該演算法特點為簡單明瞭,但會出現結點被重複遍歷,效率稍低 

bool isbalanced(binarytreenode *root)

} int treedepth(binarytreenode *root)

}

上面的**固然簡潔,但我們也要注意到由於乙個節點會被重複遍歷多次,這種思路的時間效率不高。例如在函式isbalance中輸入上圖中的二叉樹,首先判斷根結點(值為1的結點)的左右子樹是不是平衡結點。此時我們將往函式treedepth輸入左子樹根結點(值為2的結點),需要遍歷結點4、5、7。接下來判斷以值為2的結點為根結點的子樹是不是平衡樹的時候,仍然會遍歷結點4、5、7。毫無疑問,重複遍歷同乙個結點會影響效能。接下來我們尋找不需要重複遍歷的演算法。

如果我們用後序遍歷的方式遍歷二叉樹的每乙個結點,在遍歷到乙個結點之前我們已經遍歷了它的左右子樹。只要在遍歷每個結點的時候記錄它的深度(某一結點的深度等於它到葉節點的路徑的長度),我們就可以一邊遍歷一邊判斷每個結點是不是平衡的。下面是這種思路的參考**:

//更為高效的演算法,後序遍歷二叉樹,遍歷每個結點時記錄它的深度

bool isbalanced(binarytreenode *root, int &depth)

int left,right;

if(isbalanced(root->lchild, left) && isbalanced(root->rchild, right))

} return false;

}

在上面的**中,我們用後序遍歷的方式遍歷整棵二叉樹。在遍歷某結點的左右子結點之後,我們可以根據它的左右子結點的深度判斷它是不是平衡的,並得到當前結點的深度。當最後遍歷到樹的根結點的時候,也就判斷了整棵二叉樹是不是平衡二叉樹了。

程式設計師面試題精選

問題描述 輸入乙個字串,列印出該字串中字元的所有排列。例如輸入字串abc,則輸出由字元a b c所能排列出來的所有字串abc acb bac bca cab和cba。問題分析 這是一道很好的考查對遞迴理解的程式設計題。寫遞迴程式關鍵有兩點,處理好進入與返回的關係,進入時改變了什麼,返回時應當恢復。字...

二叉樹面試題

1.求二叉樹節點個數 可以使用遞迴解決。將問題分解為求根節點 左子樹的節點數 右節點的節點數。實現 public size t size private size t size node root 2.求頁節點個數 頁節點 左右子樹都為空的節點被稱為頁節點,使用遞迴遍歷,當碰到乙個左右子樹為空的節點...

面試題 二叉樹

面試題 二叉樹 1.重建二叉樹 前序 中序 treenode reconstructbinarytree vector pre,vector vin treenode root new treenode pre 0 int pos 0 for pos pre left,vin left,pre ri...