Symetrict Tree / Same Tree - LeetCode

本文深入探讨了树的遍历方法,包括先序、中序和后续遍历,并详细介绍了如何使用栈实现这些遍历。接着,文章通过一个具体的示例,阐述了判断两棵树是否对称的算法,包括使用递归和迭代的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

树的遍历:
先序- 中左右。迭代时使用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;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值