二叉樹的深度

2021-07-03 15:49:26 字數 4164 閱讀 8779

private

static

class binarytreenode

public

binarytreenode(int val)

}

如果一棵樹只有乙個結點,它的深度為。 如果根結點只有左子樹而沒有右子樹, 那麼樹的深度應該是其左子樹的深度加1,同樣如果根結點只有右子樹而沒有左子樹,那麼樹的深度應該是其右子樹的深度加1. 如果既有右子樹又有左子樹, 那該樹的深度就是其左、右子樹深度的較大值再加1 . 比如在圖6.1 的二叉樹中,根結點為1 的樹有左右兩個子樹,其左右子樹的根結點分別為結點2和3。根結點為2 的左子樹的深度為3 , 而根結點為3 的右子樹的深度為2,因此根結點為1的樹的深度就是4 。 

這個思路用遞迴的方法很容易實現, 只儒對遍歷的**稍作修改即可。

}解法一:需要重蟹遍歷結點多次的解法

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

public static boolean isbalanced(binarytreenode root) 

intleft = treedepth(root.left);

intright = treedepth(root.right);

int diff = left - right;

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

return isbalanced(root.left) && isbalanced(root.right);

}

解法二:每個結點只遍歷一次的解法

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

/**

* 判斷是否是平衡二叉樹,第二種解法

* *@param root

*@return

*/public

static

boolean

isbalanced2(binarytreenode root)

public

static

boolean

isbalancedhelper(binarytreenode root, int depth)

int left = new

int[1];

int right = new

int[1];

if (isbalancedhelper(root.left, left) && isbalancedhelper(root.right, right))

}return

false;

}

public

class

test39

public

binarytreenode(int val)

}public

static

inttreedepth(binarytreenode root)

int left = treedepth(root.left);

int right = treedepth(root.right);

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

}/**

* 判斷是否是平衡二叉樹,第一種解法

**@param root

*@return

*/public

static

boolean

isbalanced(binarytreenode root)

int left = treedepth(root.left);

int right = treedepth(root.right);

int diff = left - right;

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

return isbalanced(root.left) && isbalanced(root.right);

}/**

* 判斷是否是平衡二叉樹,第二種解法

**@param root

*@return

*/public

static

boolean

isbalanced2(binarytreenode root)

public

static

boolean

isbalancedhelper(binarytreenode root, int depth)

int left = new

int[1];

int right = new

int[1];

if (isbalancedhelper(root.left, left) && isbalancedhelper(root.right, right))

}return

false;

}public

static

void

main(string args)

// 完全二叉樹

// 1

// / \

// 2 3

// /\ / \

// 4 5 6 7

private

static

void

test1()

// 不是完全二叉樹,但是平衡二叉樹

// 1

// / \

// 2 3

// /\ \

// 4 5 6

// /

// 7

private

static

void

test2()

// 不是平衡二叉樹

二叉樹的深度 二叉樹的深度

題目描述輸入一棵二叉樹,求該樹的深度。從根結點到葉結點依次經過的結點 含根 葉結點 形成樹的一條路徑,最長路徑的長度為樹的深度。及測試用例 單步除錯檢視過程 public class solution19 拿到左子樹的最大深度 int leftdep treedepth root.left 拿到右子...

二叉樹的深度 二叉樹的深度 二叉樹最大寬度

題目 輸入一棵二叉樹的根節點,求該樹的深度。從根節點到葉節點依次經過的節點 含根 葉節點 形成樹的一條路徑,最長路徑的長度為樹的深度。例如 給定二叉樹 3,9,20,null,null,15,7 返回它的最大深度 3 根節點加上左右子樹的最大深度就是樹的最大深度。如下 class solution ...

二叉樹之 二叉樹深度

二叉樹深度 獲取最大深度 public static int getmaxdepth treenode root 二叉樹寬度 使用佇列,層次遍歷二叉樹。在上一層遍歷完成後,下一層的所有節點已經放到佇列中,此時佇列中的元素個數就是下一層的寬度。以此類推,依次遍歷下一層即可求出二叉樹的最大寬度 獲取最大...