您的位置:首页 > 其它

Symetrict Tree / Same Tree - LeetCode

2015-05-09 02:38 260 查看
树的遍历:

先序- 中左右。迭代时使用1个stack来存放过往节点。

中序- 左中右。迭代时使用1个stack来存放过往节点。

后续- 左右中。迭代时使用2个stack,s1 push 左节点,右节点,s2 push 根节点。

<1> isSymetricTree:

传入左右两个子树。

他们还有他们的孩子都要是symetric的。

时间复杂度:

正常的遍历一边树。O(n).

空间复杂度:O(logn)

class Solution {
public:
bool isSymmetric(TreeNode* root) {
if(root == NULL) return true;
TreeNode* rl;
TreeNode* rr;
rl = root->left;
rr = root->right;
if(rr->val!=rr->val) return false;
return Helper(rl,rr);
}
bool Helper(TreeNode *rl, TreeNode *rr)
{
if(rl == NULL && rr == NULL) return true;
if(rl==NULL && rr!=NULL) return false;
if(rl!=NULL && rr == NULL) return false;
if(rl->val!=rr->val) return false;
return Helper(rl->left,rr->right) && Helper(rl->right, rr->left);
}
};


<2> isSameTree

用stack,同进同出。

注意:不能单独判断left和right是否为空。否则stack不是同时记录。下面的情况若是curp->right!=NULL,curq->right=NULL 就不进行push了 是不对的。

[10,5,15], [10,5,null,null,15]

Output: true

Expected: false

class Solution {
public:
bool isSameTree(TreeNode* p, TreeNode* q) {
//pre-order iteration
if(q==NULL && p == NULL) return true;
if(q==NULL || p==NULL) return false;
stack<TreeNode*> stkp,stkq;
stkp.push(p);
stkq.push(q);
while(!stkp.empty() && !stkq.empty())
{
TreeNode *curp = stkp.top();
TreeNode *curq = stkq.top();
stkp.pop();
stkq.pop();
if(curp==NULL && curq==NULL) continue;
if(curp!=NULL && curq!=NULL && curq->val==curp->val)
{
stkp.push(curp->right);
stkq.push(curq->right);
stkp.push(curp->left);
stkq.push(curq->left);
}
else return false;
}
return true;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: