题目:相同的树
题目描述:给定两个二叉树,编写一个函数来检验它们是否相同。
如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。
示例 1:
输入: 1 1
/ \ /
2 3 2 3
[1,2,3], [1,2,3]
输出: true
示例 2:
输入: 1 1
/
2 2
[1,2], [1,null,2]
输出: false
示例 3:
输入: 1 1
/ \ /
2 1 1 2
[1,2,1], [1,1,2]
输出: false
/**
-
相同的树
*/
public class TreeNode {
int val; //变量值
TreeNode left; //左子树
TreeNode right; //右子树public TreeNode(int i) {
val = i;
}public static void main(String[] args) {
TreeNode t1 = new TreeNode(1);
t1.left = new TreeNode(2);
t1.right = new TreeNode(3);
TreeNode t2 = new TreeNode(1);
t2 = new TreeNode(2);
t2.right = new TreeNode(1);
boolean res = isSameTree(t1, t2);
System.out.println(“这两棵树是否相同:”+res);}
/**
-
递归方法
-
@param p
-
@param q
-
@return
*/
/*public static boolean isSameTree(TreeNode treeNode1, TreeNode treeNode2){
if (treeNode1 == null && treeNode2 == null){ //两个数都为空,返回false
return true;
}
if (treeNode1 == null){ //第一个树为空,返回false
return false;
}
if (treeNode2 == null){ //第二棵树为空
return false;
}if (treeNode1.val == treeNode2.val){ //判断两棵树的值是否相等,不相等返回false。
return isSameTree(treeNode1.left,treeNode2.left) && isSameTree(treeNode2.right,treeNode2.right);
}else{
return false;
}
}*/
/**
-
非递归方法,前序遍历,先根再左后右
-
@param p
-
@param q
-
@return
*/
public static boolean isSameTree(TreeNode p, TreeNode q) {
if(p == null && q == null)
return true;
if(p == null) return false;
if(q == null) return false;
//创建两个栈
Stack stackp = new Stack<>();
Stack stackq = new Stack<>();
stackp.add§;
stackq.add(q);
while(!stackp.isEmpty() || !stackq.isEmpty()) { //如果栈不为空
TreeNode pp = stackp.pop(); //移除堆栈顶部的对象,并将该对象作为函数的值返回
TreeNode qq = stackq.pop();if(pp == null && qq == null) //两个节点为空时,不再入栈左孩子和右孩子 continue; if(pp == null) return false; if(qq == null) return false; if(pp.val != qq.val) return false; else { //注意栈是后进先出,所以先入栈右子树,再入栈左子树 stackp.add(pp.right); stackq.add(qq.right); stackp.add(pp.left); stackq.add(qq.left); }
}
return true;
}
-
}
/**
- 先判断是否都为空树,如果是就返回ture,
- 在判断是否有一个空树,是就返回false,
- 两个树都不为空,比较他们的val,如果不相等就返回false,
- 相等的话,就遍历它的左右子树,直到不符合条件跳出.
*/