二叉树的深度计算[递归与非递归方式] java实现

二叉树树的结构
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为空。
    
 
static int depth(BinaryTree pNode){
Stack<BinaryTree> stack=new Stack<BinaryTree>();
Stack<Integer> tag=new Stack<Integer>();
if(pNode==null) return 0;
BinaryTree cur=pNode;
int max=0;
while(cur!=null||!stack.empty()){
while(cur!=null){//将当前元素入栈,并尝试不断将其左孩子入栈
stack.push(cur);
tag.push(0);
cur=cur.getLeft();
}
//cur为null,栈顶元素无左孩子
if(tag.peek()==1){
max=Math.max(max, stack.size());
//System.out.print(stack.peek().getValue()+",");此处输出的值为后序遍历的结果
stack.pop();
tag.pop();
cur=null;//将当前指针指向空,则不执行从该节点向左找左孩子的操作
}else{
BinaryTree node=stack.peek();
cur=node.getRight();
//修改栈顶tag标记为1
 tag.pop();
 tag.push(1);
}
 
}
return max;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值