您的位置:首页 > 编程语言 > Java开发

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

2013-10-18 22:53 197 查看
二叉树树的结构 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; }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐