相同的树
在leetCode有这样一个题目:
给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。
如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。
eq:
输入:p = [1,2,3], q = [1,2,3]
输出:true
思路:
经过一会的脑力风暴,发现这题可以用递归,或者非递归的前中序遍历等方式解决。
第一种方法:递归
这种方法只要判断两树的结点有一个层次结构不同就为false,如果层次结构相同,就将根左右各结点每次进行比较判断,都满足则为true,否则为false
-
流程实例图
-
代码示例
if (Objects.isNull(p) && Objects.isNull(q)) {
return true;
}
if (Objects.isNull(p)) {
return false;
}
if (Objects.isNull(q)) {
return false;
}
return p.val == q.val
&& isSameTree(p.left, q.left)
&& isSameTree(p.right, q.right);
}
该方法比较容易理解,无非就是对树的层次结构和根左右结点的值都同时比较满足,最后返回的结果就是答案。
第二种方法 :非递归树的前序遍历
该方法主要结合了二叉树的前序遍历,根左右,即先遍历根结点的当前结点,之后再遍历左子结点,最后在遍历右子结点。
这里先对树的前序遍历和中序遍历和后序遍历作个简单的介绍
从图我们可以得出所谓的前中后序遍历是针对输出根节点的位置来决定的,输出根节点在前,就是前序遍历,其他两种遍历同理。
最后我们知道树的遍历方式,这题用前序遍历解决就不难了,结合栈的先进后出的特点,将节点存储到栈中,之后进行pop出比较,就可以得出结果。
public boolean isSameTreePre(TreeNode p, TreeNode q) {
if (Objects.isNull(p) && Objects.isNull(q)) return true;
if (Objects.isNull(p)) return false;
if (Objects.isNull(q)) return false;
Stack<TreeNode> stackP = new Stack<>();
stackP.add(p);
Stack<TreeNode> stackQ = new Stack<>();
stackQ.add(q);
while (!stackP.isEmpty() || !stackQ.isEmpty()) {
TreeNode pNode = stackP.pop();
TreeNode qNode = stackQ.pop();
if (Objects.isNull(pNode) && Objects.isNull(qNode)) continue;
if (Objects.isNull(pNode)) return false;
if (Objects.isNull(qNode)) return false;
if (!Objects.equals(pNode.val,qNode.val)) {
return false;
} else {
stackP.add(pNode.right);
stackQ.add(qNode.right);
stackP.add(pNode.left);
stackQ.add(qNode.left);
}
}
return true;
}