递归
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;
}
Queue<TreeNode> queue=new LinkedList<>();
queue.add(root);
int height=1;
while(!queue.isEmpty()){
TreeNode node=queue.peek();
if(node.left==null&&node.right==null){
break;
}else{
if(node.left!=null){
queue.add(node.left);
}
if(node.right!=null){
queue.add(node.right);
}
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));
}
}