求二叉樹深度 判斷是否是平衡二叉樹

2021-08-04 22:42:00 字數 1607 閱讀 8454

遞迴的方法:從根節點按照先序順序遍歷二叉樹,返回左子樹和右子樹中較大的深度,再加上1就是根節點的深度。

typedef

struct treenodetreenode, *bitree;

int treemaxdepth(bitree proot)

int left = treemaxdepth(proot->leftchild);

int right = treemaxdepth(proot->rightchild);

return left > right ? left+1 : right+1;

}

求解二叉樹的寬度利用二叉樹的層序遍歷的思想,把每層的節點儲存在佇列中,用curwidth記錄當前層的寬度,nextwidth記錄下一層的寬度。每次把當前層的節點出隊,curwidth–,其子節點入隊,nextwidth++, 用width來儲存最大的寬度。

typedef

struct treenodetreenode, *bitree;

int widthofbitree(bitree proot)

int curwidth = 1;

int nextwidth = 0;

int width = 1;

queue

node;

node.push(proot);

while(!node.empty())

if(tmp->rightchild != null)

curwidth--;

}if(nextwidth>width)

curwidth = nextwidth;

nextwidth = 0;

}return width;

}

平衡二叉樹:每個節點的左右子樹的深度差不超過1。利用求二叉樹深度演算法,判斷每個節點的左右子樹是否滿足平衡二叉樹的條件即可。

bool isbalance(bitree proot)

int left = treemaxdepth(proot->leftchild);

int right = treemaxdepth(proot->rightchild);

int diff = left - right;

if(diff < -1 || diff > 1)

return isbalance(proot->leftchild) && isbalance(proot->rightchild);

}

但是上訴演算法不夠高效,會重複遍歷遍歷節點。根據二叉樹的後序遍歷的思想,我們可以設計出更高效的演算法,每遍歷到乙個節點就記錄下當前節點的深度,這樣就不需要重複遍歷了,只需要線性時間即可判斷左右子樹的深度是否滿足平衡二叉樹的條件。

bool isbalance_fast(bitree proot, int& pdepth)

intleft, right;

if(isbalance_fast(proot->leftchild, left) && isbalance_fast(proot->rightchild, right))

}return false;

}

判斷二叉樹是否是平衡二叉樹

二叉樹的節點定義為 public class treenode 二叉樹的深度 根節點到葉節點的最長路徑長度 平衡二叉樹 二叉樹中任一節點的左右子樹的深度相差不超過1 遞迴的方法 如下 public boolean isbalanced treenode root intleft getheight ...

判斷二叉樹是否是平衡二叉樹

平衡二叉搜尋樹 balanced binary tree 具有以下性質 它是一棵空樹或它的左右兩個子樹的高度差的絕對值不超過1,並且左右兩個子樹都是一棵平衡二叉樹。思路 如果一顆二叉樹的所有子樹都是平衡二叉樹,它一定是平衡二叉樹。include using namespace std typedef...

判斷二叉樹是否是平衡二叉樹

平衡樹 balance tree,bt 指的是,任意節點的子樹的高度差都小於等於1。力扣 110也有該題,可以用來驗證。如果二叉樹為空,返回true。計算出左子樹和右子樹的最大深度。如果左右子樹的最大深度的差值小於2,並且左 右子樹都是平衡二叉樹,則該二叉樹是平衡二叉樹。判斷二叉樹是否是平衡二叉樹 ...