首页 > 技术文章 > 牛客网-21天刷题计划-第2节 进阶-对称的二叉树

ke-yi- 2018-10-19 20:32 原文

使用非递归的二叉树遍历实现。

#include<iostream>
using namespace std;
const int maxn=10000;/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};
*/
class Solution {
public:
    bool isSymmetrical(TreeNode* pRoot)
    {
        //头节点为空
        if(pRoot==NULL)return true;
        //定义变量
        int top=-1;
        TreeNode*pl[maxn],*pr[maxn],*p_l,*p_r;
        //初始化栈
        top++;pl[top]=pr[top]=pRoot;
        //左右序遍历
        while(top!=-1)
        {
            //头节点出栈
            p_l=pl[top];p_r=pr[top];top--;
            //判断是否对称
            if(p_l->val!=p_r->val)return false;
            bool bpll=p_l->left==NULL,bplr=p_l->right==NULL;
            bool bprl=p_r->left==NULL,bprr=p_r->right==NULL;
            if((bpll^bprr)||(bplr^bprl))break;
            //将子节点入栈
            if(p_l->left!=NULL)
            {
                top++;
                pl[top]=p_l->left;
                pr[top]=p_r->right;
            }
            if(p_l->right!=NULL)
            {
                top++;
                pl[top]=p_l->right;
                pr[top]=p_r->left;
            }
        }
        return top==-1;
    }

};

 经过数十次的提交最后终于过了
第一次找出没有考虑这个if(pRoot==NULL)return true;
提交多次,会想以前写过的遍历算法,递归和非递归都是一样的思路,没有什么漏洞
怀疑栈定义的问题,将maxn改为1000没有用,又改成1e6还是没有用
看了一眼老师和其它同学的提交记录都是使用递归的方法,开始就是怀疑栈溢出,但是使用了数组栈还是溢出应该不可能
整理了一下思路,有看是整理了一下代码
第二次找出判断出错
            bool bpll=p_l->left==NULL,bplr=p_l->right==NULL;
            bool bprl=p_r->left==NULL,bprr=p_r->right==NULL;
            if((bpll^bprr)||(bplr^bprl))break;
还是不行,继续往下找,发现入栈时,判断是这样写的if(p_l!=NULL)and if(p_l!=NULL)
改了过来,过了10%
开始肯定了自己的逻辑,找了一下代码,没错
第三次找出题意的对称不仅仅是形状上的对称,数值上也要对称相等,加上了if(p_l->val!=p_r->val)return false;
然后就过了。

思路:形状上的对称只要,同时先序遍历后序遍历,如果同时存在相同的子节点就对称,数值就在判断子节点的时候,判断一下数值就行。

推荐阅读