二叉树树的结构
class BinaryTree<T>{
T value;
BinaryTree<T> left;
BinaryTree<T> right;
public T getValue() {
return value;
}
public void setValue(T value) {
this.value = value;
}
public BinaryTree<T> getLeft() {
return left;
}
public void setLeft(BinaryTree<T> left) {
this.left = left;
}
public BinaryTree<T> getRight() {
return right;
}
public void setRight(BinaryTree<T> right) {
this.right = right;
}
}
1、递归方式
public int depth(
BinaryTree node){
int dep=0;
if(node!=null){
int left=depth(node.getLeft());//计算左子树的深度
int right=depth(node.getRight());//计算右子树的深度
dep= Math.max(left,right)+1;//以当前结点为根结点的子树的深度
}
return dep;
}
2、
非递归方式,使用两个栈,采用后序遍历二叉树的非递归算法的思路。tag栈中标志在stack栈中结点的状态(结点有两种状态1或者0,1表示访问过其右孩子,0表示没有访问过其右孩子)。
在循环的过程如下:
首先判断当前元素是否为空,如果不为空则不断的将元素及其非空左孩子入栈,并标志这些结点为0。
当添加左孩子入栈完成后(此时当前指针cur==null),判断标志栈的栈顶元素是否为已经访问过右孩子的结点(是否为1),
如果是则比较当前栈的元素个数与max值,取两者中大的给新的max。并将栈顶元素出栈,然后将当前结点的指针置为空(防止重复的添加该元素及其左子树,迫使下次循环时取栈顶元素,判断栈顶元素状态:再次从栈中弹出元素或者改变指向为栈顶元素的右子树)。
如果不是则取栈顶元素,将其其标志位设为1,再将当前指针cur指向其右孩子。
重复循环,直到当前指向结点为空并且stack为空。