題目Maximum Depth of Binary Tree
Given a binary tree, find its maximum depth.
The maximum depth is the number of nodes along the longest path from the root node down to the farthest leaf node.
分析
1,可以根據二叉樹的定義來求解書的最大深度
0, root == null
maxDepth(root) = 1+max(maxDepth(root.left),maxDepth(root.right))
2,可以采用層次遍歷, 有多少層,就是二叉樹的深度
3,可以利用二叉樹后序非遞歸遍歷的性質,棧中保存的是當前節點的所有祖先節點(他的這些節點都
是未訪問過的).
所以當我們遇到葉子節點的時候,棧中保存的就是該葉子節點到根節點的所有節點,那么該葉子的深度
就是棧中元素的個數
1,遞歸
遞歸式
0, root == null
maxDepth(root) = 1+max(maxDepth(root.left),maxDepth(root.right))
public int maxDepth(TreeNode root) {
if(root == null){
return 0;
}
return Math.max(maxDepth(root.left), maxDepth(root.right)) + 1;
}
2,利用層次遍歷
public int maxDepth(TreeNode root) {
if(root == null){
return 0;
}
List<TreeNode> curLevelNodes = new ArrayList<TreeNode>();
curLevelNodes.add(root);
int level = 0;
while(!curLevelNodes.isEmpty()){
List<TreeNode> nextLevelNodes = new ArrayList<TreeNode>();
for(TreeNode node : curLevelNodes){
if(node.left != null){
nextLevelNodes.add(node.left);
}
if(node.right != null){
nextLevelNodes.add(node.right);
}
}
level++;
curLevelNodes = nextLevelNodes;
}
return level;
}
3,利用后序遍歷棧中元素的性質
public int maxDepth(TreeNode root) {
if(root == null){
return 0;
}
Stack<TreeNode> stack = new Stack<TreeNode>();
TreeNode node = root;
TreeNode tempNode = null;
boolean visited = false;
int height = 0;
do{
while(node != null ){
stack.push(node);
node = node.left;
}
tempNode = null;
visited = true;
while(!stack.empty() && visited){
node = stack.peek();
if(node.right == tempNode){
//葉子節點
if(node.left == null && node.right == null){
height = height > stack.size() ? height : stack.size();
}
tempNode = node;
stack.pop();
}else{
node = node.right;
visited = false;
}
}
}while(!stack.empty());
return height;
}