p8 判断二叉树是否相同 (leetcode 100)
一:解题思路
因为树是递归定义的,所以与二叉树的相关操作都可以用递归的方法来解决。用递归的方法来解决,从本质上看也就可以用迭代的方法来解决。这道题目与之前博客的p4(判断二叉树是否对称)几乎是一模一样的。这道题的难度在于,用迭代法求解这个题目,用一个栈来存储树节点。
二:完整代码示例 (C++版和Java版)
递归C++版:
class Solution { public: bool isSameTree(TreeNode* p, TreeNode* q) { if (p == NULL && q == NULL) return true; if (p == NULL || q == NULL) return false; return (p->val==q->val) && (isSameTree(p->left,q->left)) && (isSameTree(p->right,q->right)); } };
递归Java版:
class Solution { public boolean isSameTree(TreeNode p, TreeNode q) { if(p==null&&q==null) return true; if(p==null||q==null) return false; return (p.val==q.val)&& (isSameTree(p.left,q.left))&& (isSameTree(p.right,q.right)); } }
C++迭代版:
class Solution { public: bool isSameTree(TreeNode* p, TreeNode* q) { stack<TreeNode*> stack; stack.push(p); stack.push(q); while (!stack.empty()) { TreeNode* s = stack.top(); stack.pop(); TreeNode* t = stack.top(); stack.pop(); if (s == NULL && t == NULL) continue; if (s == NULL || t == NULL) return false; if (s->val != t->val) return false; stack.push(s->left); stack.push(t->left); stack.push(s->right); stack.push(t->right); } return true; } };
Java迭代版:
class Solution { public boolean isSameTree(TreeNode p, TreeNode q) { Stack<TreeNode> stack=new Stack<>(); stack.push(p); stack.push(q); while(!stack.empty()) { TreeNode s=stack.pop(); TreeNode t=stack.pop(); if(s==null&&t==null) continue; if(s==null||t==null) return false; if(s.val!=t.val) return false; stack.push(s.left); stack.push(t.left); stack.push(s.right); stack.push(t.right); } return true; } }
python递归法:
from typing import List
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
class Solution:
def isSame(self, p: TreeNode, q: TreeNode) -> bool:
if p is None and q is None: return True
if p is None or q is None: return False
return (p.val==q.val) and (self.isSame(p.left,q.left)) and (self.isSame(p.right,q.right));
def isSameTree(self, p: TreeNode, q: TreeNode) -> bool:
return self.isSame(p,q)

浙公网安备 33010602011771号