# 计算二叉树高度的三种方法

### 递归

public class 递归 {
class TreeNode{
int val;
TreeNode left;
TreeNode right;
public TreeNode(int value){
this.val=value;
}
}
public int getHeight(TreeNode root){
if(root==null){
return 0;
}
int leftheight=getHeight(root.left);
int rightheight=getHeight(root.right);
return Math.max(leftheight, rightheight)+1;
}

}

### 非递归

1.后序遍历二叉树

public class Solution {
public int TreeDepth(TreeNode root) {
if(root==null){
return 0;
}
int height=0;
Stack<TreeNode> nodes=new Stack<>();
Stack<Integer> tag=new Stack<>();
while(root!=null||!nodes.isEmpty()){
while(root!=null){
nodes.push(root);
tag.push(0);
root=root.left;
}
if(tag.peek()==1){
height=Math.max(height, nodes.size());
nodes.pop();
tag.pop();
root=null;
}else{
root=nodes.peek();
root=root.right;
tag.pop();
tag.push(1);
}
}
return height;
}
}

2.按层次遍历二叉树

public class 层次遍历二叉树求高度 {
static class TreeNode{
int val;
TreeNode left;
TreeNode right;
public TreeNode(int value){
this.val=value;
}
}
public static int getHeight(TreeNode root){
if(root==null){
return 0;
}
int height=1;
while(!queue.isEmpty()){
TreeNode node=queue.peek();
if(node.left==null&&node.right==null){
break;
}else{
if(node.left!=null){
}
if(node.right!=null){
}
queue.poll();
height++;
}

//System.out.println(height);

}
return height;
}

public static void main(String[] args){
TreeNode root=new TreeNode(1);
root.left=new TreeNode(2);
root.right=new TreeNode(3);
System.out.println(getHeight(root));
}

}