Same Tree(LeetCode)

来源:互联网 发布:ps mac版破解 编辑:程序博客网 时间:2024/06/05 11:51

题目:Given two binary trees, write a function to check if they are equal or not.
Two binary trees are considered equal if they are structurally identical and the nodes have the same value.

递归方法解决:

class Solution {public:bool isSameTree(TreeNode *p, TreeNode *q) {//判断当前树是否相同if(p==NULL && q==NULL)//都为空return true;if(p==NULL || q==NULL)//有一个为空return false;if(p->val!=q->val)//都不为空return false;//判断两颗树的左右子树是否相等return isSameTree(p->left,q->left)&&isSameTree(p->right,q->right);}};

非递归方法解决:

分析:此方法利用空指针域,如果指针为空,则相当于遍历到INT_MAX,主要是解决结点值有重复的情况。
例如:
           1
          /   \
         #    1
              /   \
             #   #   
            1
           /   \
          1    #
         /  \
       #   #
此时两棵树的先序和中序遍历结果会不同,能够判断不是 Same Tree。
class Solution {public:bool isSameTree(TreeNode *p, TreeNode *q) {if(p==NULL && q==NULL)return true;if(p==NULL || q==NULL)return false;vector<int> pVec,qVec;PreOrderTraverse(p,pVec);PreOrderTraverse(q,qVec);if(!isTraverseSame(pVec,qVec))return false;pVec.clear();qVec.clear();InOrderTraverse(p,pVec);InOrderTraverse(q,qVec);if(!isTraverseSame(pVec,qVec))return false;return true;}void PreOrderTraverse(TreeNode* root,vector<int> & preOrderVec){if(root!=NULL){preOrderVec.push_back(root->val);PreOrderTraverse(root->left,preOrderVec);PreOrderTraverse(root->right,preOrderVec);}else{preOrderVec.push_back(INT_MAX);//利用空指针域}}void InOrderTraverse(TreeNode* root,vector<int> & inOrderVec){if(root!=NULL){PreOrderTraverse(root->left,inOrderVec);inOrderVec.push_back(root->val);PreOrderTraverse(root->right,inOrderVec);}else{inOrderVec.push_back(INT_MAX);}}bool isTraverseSame(vector<int> &ppreOrderVec,vector<int> &qpreOrderVec){vector<int>::iterator piter=ppreOrderVec.begin();vector<int>::iterator qiter=qpreOrderVec.begin();while(piter!=ppreOrderVec.end()){if(*piter!=*qiter)return false;piter++;qiter++;}return true;}};


0 0