您的位置:首页 > 其它

判断两棵二叉树是否相同的树

2016-09-16 13:26 447 查看
判断两棵二叉树是否相同的树,递归实现方式是,需要知道递归的出口,

(1)如果两棵二叉树都为空,返回真

(2)如果两棵二叉树一棵为空,另一棵不为空,返回假

(3)否则递归左子树和右子树

如果是非递归实现判断两颗二叉树是否相同,可以按层次遍历,需要借助两个队列

(1)在while循环内,如果两个当前节点都是空值,跳出本次循环继续下一次循环

(2)如果两个当前节点都不为空,并且他们值相等,则他的左右孩子节点都入队

(3)如果只要不满足一个条件,说明两棵树不相同,直接return false

(4)如果不满足while条件,说明这两颗二叉树已经遍历完了,是一颗相同的二叉树,返回true

实现过程如下所示:

package cn.edu.nwu.tree;

import java.util.LinkedList;
import java.util.Queue;

/**
* @author jcm
*
*时间 2016年9月16日
*/
public class GetTreeNodeIsSame {
public static void main(String[] args) {
TreeNode r1 = CreateBinaryTree.createTreeNode();
TreeNode r2 = CreateBinaryTree.createTreeNode2();
System.out.println(getTreeNodeIsSameRecursion(r1,r2));
System.out.println(getTreeNodeIsSame(r1,r1));
}
/**
* @author jcm
* 判断两棵二叉树是否相同的树,需要知道递归的出口
* (1)如果两棵二叉树都为空,返回真
* (2)如果两棵二叉树一棵为空,另一棵不为空,返回假
* (3)否则递归左子树和右子树
* @param r1
* @param r2
* @return
*/
private static boolean getTreeNodeIsSameRecursion(TreeNode r1, TreeNode r2) {
// 如果两棵二叉树都为空,返回真
if(r1==null && r2==null){
return true;
}else if(r1 == null || r2 == null){// 如果两棵二叉树一棵为空,另一棵不为空,返回假
return false;
}
if(r1.data != r2.data){
return false;
}
boolean leftBoolean = getTreeNodeIsSameRecursion(r1.leftChild,r2.leftChild);
boolean rightBoolean = getTreeNodeIsSameRecursion(r1.rightRight,r2.rightRight);
return leftBoolean&&rightBoolean;
}
/**
* @author jcm
* 可以按层次遍历,需要借助两个队列
* (1)在while循环内,如果两个当前节点都是空值,跳出本次循环继续下一次循环
* (2)如果两个当前节点都不为空,并且他们值相等,则他的左右孩子节点都入队
* (3)如果只要不满足一个条件,说明两棵树不相同,直接return false
* (4)如果不满足while条件,说明这两颗二叉树已经遍历完了,是一颗相同的二叉树,返回true
* @param r1
* @param r2
* @return
*/
private static boolean getTreeNodeIsSame(TreeNode r1, TreeNode r2) {
if(r1 == null && r2 == null){
return true;
}else if(r1 == null || r2 == null){
return false;
}
Queue<TreeNode> q1 = new LinkedList<TreeNode>();
Queue<TreeNode> q2 = new LinkedList<TreeNode>();
q1.add(r1);
q2.add(r2);
while(!q1.isEmpty() && !q2.isEmpty()){
TreeNode current1 = q1.remove();
TreeNode current2 = q2.remove();
if(current1 ==null && current2==null){
continue;
}else if(current1 !=null && current2 != null && current1.data == current2.data){
q1.add(current1.leftChild);
q1.add(current1.rightRight);
q2.add(current2.leftChild);
q2.add(current2.rightRight);
}else{
return false;
}
}
return true;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  二叉树