尝试不同方法求二叉树的深度:
1.depth1,递归计算二叉树的深度,根结点的深度=max(左子树的深度,右子树的深度) + 1。
2.depth2,访问左结点,如有右结点则压栈1,同时把右结点的深度压栈2,没有左结点时表示该次遍历完成,记录深度;从栈1取出结点,栈2取出该结点的深度,再次遍历。
3.depth3,利用层序遍历的思想,每完成一层的遍历就给一个标记。
package com.devchao.tree;import java.util.LinkedList;import java.util.Queue;import java.util.Stack;public class BinaryTree { public static void main(String[] args) { Node n15 = new Node(15, null, null); Node n14 = new Node(14, n15, null); Node n13 = new Node(13, null, n14); Node n12 = new Node(12, n13, null); Node n11 = new Node(11, null, n12); Node n5 = new Node(5, null, null); Node n6 = new Node(6, null, null); Node n8 = new Node(8, null, null); Node n9 = new Node(9, n11, null); Node n10 = new Node(10, null, null); Node n7 = new Node(7, n8, null); Node n4 = new Node(4, n6, n7); Node n3 = new Node(3, null, n5); Node n2 = new Node(2, n9, n10); Node n1 = new Node(1, n3, n4); Node root = new Node(0, n1, n2); System.out.println(depth3(root)); } public static int depth1(Node root){ int dep1 = 1, dep2 = 1; if(root.left != null) { dep1 = dep1 + depth1(root.left); } if(root.right != null) { dep2 = dep2 + depth1(root.right); } System.out.println(root.data + " " + dep1 + " " + dep2); return dep1 >= dep2 ? dep1 : dep2; } public static int depth2(Node root){ int dep = 1, tempDep = 1; Stackq = new Stack (); Stack dq = new Stack (); Node node = root; while(node != null || !q.isEmpty()) { if(node == null) { node = q.pop(); dep = dep < tempDep ? tempDep : dep; tempDep = dq.pop(); } if(node.right != null) { dq.add(tempDep + 1); q.add(node.right); } if(node.left != null) { tempDep = tempDep + 1; } node = node.left; } return dep; } public static int depth3(Node root){ int dep = 0, tempTag = 0; Queue queue = new LinkedList<>(); queue.add(root); Queue tagQueue = new LinkedList<>(); tagQueue.add(1); while(!queue.isEmpty()) { root = queue.poll(); if(root.left != null) { queue.add(root.left); tagQueue.add(0); } if(root.right != null) { queue.add(root.right); tagQueue.add(0); } tempTag = tagQueue.poll(); if(tempTag == 1) { dep = dep + 1; if(!tagQueue.isEmpty()) { tagQueue.remove(); tagQueue.add(1); } } } return dep; } static class Node { public int data; public Node left; public Node right; public Node(int data, Node left, Node right) { this.data = data; this.left = left; this.right = right; } }}