p8 判断二叉树是否相同 (leetcode 100)

匆匆过客 提交于 2020-03-08 16:52:19

一:解题思路

因为树是递归定义的,所以与二叉树的相关操作都可以用递归的方法来解决。用递归的方法来解决,从本质上看也就可以用迭代的方法来解决。这道题目与之前博客的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;
    }
}

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!