二叉树的深度计算[递归与非递归方式] 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; }
重复循环,直到当前指向结点为空并且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; }
相关文章推荐
- Java代码分别用递归和非递归方式计算二叉树的最大深度
- 递归与非递归方式判断二叉树是否对称&& 按行打印二叉树【java实现】
- java使用递归,非递归方式实现二叉树的三种常见遍历方式
- 详细讲解二叉树三种遍历方式的递归与非递归实现
- 二叉树的广度优先遍历、深度优先遍历的递归和非递归实现方式
- 初识树结构,简单模拟无规律的二叉树,实现二叉树的构建,计算树的深度以及三种遍历方式以及搜索删除,销毁整个树
- 二叉树的广度优先遍历、深度优先遍历的递归和非递归实现方式 二叉树的遍历方式: 1、深度优先:递归,非递归实现方式 1)先序遍历:先访问根节点,再依次访问左子树和右子树 2)中序遍
- java实现二叉树的前序、中序、后序、层次遍历,递归与非递归
- 详细讲解二叉树三种遍历方式的递归与非递归实现
- 算法:二叉树的先序遍历、中序遍历、后序遍历(递归及非递归方式)的java代码实现
- java 实现二叉树深度优先遍历的 前、中、后序遍历(递归)
- Java三种遍历方式打印二叉树(递归实现)
- 二叉树的深度(递归和非递归)---java实现
- 二叉树三种遍历方式的递归与非递归实现
- java使用递归,非递归方式实现二叉树的三种常见遍历方式
- Java实现二叉树的建立、计算高度与递归输出操作示例
- 二叉树的最大/小深度的递归与非递归实现
- 二叉树的遍历与求深度的递归与非递归实现
- Java方式实现二叉树的前中后序遍历的递归及非递归算法
- 笔试面试算法经典--二叉树的镜像-递归与非递归实现(Java)