100. 相同的树
题目链接:
给你两棵二叉树的根节点 p
和 q
,编写一个函数来检验这两棵树是否相同。
如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。
输入:p = [1,2,3], q = [1,2,3]
输出:true
示例 2:
输入:p = [1,2], q = [1,null,2]
输出:false
示例 3:
输入:p = [1,2,1], q = [1,1,2]
输出:false
题解
思路:
方法一:递归
代码(C++):
//递归法 class Solution { public: bool isSameTree(TreeNode* p, TreeNode* q) { if (p != nullptr && q == nullptr) return false; else if (p == nullptr && q != nullptr) return false; else if (p == nullptr && q == nullptr) return true; else if (p->val != q->val) return false; bool left = isSameTree(p->left, q->left); // 1号树:左、 2号树:左 bool right = isSameTree(p->right, q->right); // 1号树:右、 2号树:右 return left && right; // 1号树:中、 2号树:中 (逻辑处理) } };
代码(JavaScript):
//递归 var isSameTree = function(p, q) { if (p === null && q === null) return true; else if (p === null || q === null) return false; else if (p.val != q.val) return false; var result1 = isSameTree(p.left, q.left); var result2 = isSameTree(p.right, q.right); return result1 && result2; };
方法一:迭代
代码(C++):
//迭代法 class Solution { public: bool isSameTree(TreeNode* p, TreeNode* q) { queue<TreeNode*> que; que.push(p); que.push(q); while (!que.empty()) { TreeNode* pNode = que.front(); que.pop(); TreeNode* qNode = que.front(); que.pop(); if (pNode == nullptr && qNode == nullptr); else if (pNode == nullptr || qNode == nullptr) return false; else if (pNode->val != qNode->val) return false; else { que.push(pNode->left); que.push(qNode->left); que.push(pNode->right); que.push(qNode->right); } } return true; } };
代码(JavaScript):
//迭代 var isSameTree = function(p, q) { let que = []; que.push(p); que.push(q); while (que.length != 0) { var node1 = que.shift(); var node2 = que.shift(); if (node1 === null && node2 === null); else if (node1 === null || node2 === null) return false; else if (node1.val != node2.val) return false; else { que.push(node1.left); que.push(node2.left); que.push(node1.right); que.push(node2.right); } } return true; };