【算法題】對稱二叉樹判斷

解法1:

分層遍歷二叉樹,判斷每一層的節點是否軸對稱。


#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>
using namespace std;
#define debug_

struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
        val(x), left(NULL), right(NULL) {}
};

bool isok(vector<TreeNode*>& vec)
{
    int i = 0, j = vec.size() - 1;
    while (i < j)
    {
        if ((vec[i] == NULL&&vec[j] != NULL) || (vec[i] != NULL&&vec[j] == NULL))
        {
            return false;
        }
        if (vec[i]==NULL&&vec[j]==NULL)//考慮對稱的空節點
        {
            i++;
            j--;
            continue;
        }
        if (vec[i]->val != vec[j]->val)
        {
            return false;
        }
        i++;
        j--;
    }
    return true;
}

bool isSymmetrical(TreeNode* pRoot)
{
        if (pRoot == NULL)
        {
            return true;
        }
        vector<TreeNode*> vec_old;
        vector<TreeNode*> vec_new;

        vec_old.push_back(pRoot);
        while (!vec_old.empty())
        {
            if (!isok(vec_old))
            {
                return false;
            }
            for (auto i = 0; i < vec_old.size(); ++i)
            {
                if (vec_old[i] == NULL)
                {
                    continue;
                }
                vec_new.push_back(vec_old[i]->left);
                vec_new.push_back(vec_old[i]->right);
            }
            swap(vec_old, vec_new);
            vec_new.clear();
        }
        return true;
}

int p = 0;
TreeNode* DeSerialByPre(char* str)
{
    if (str[p] == '#'){
        p += 2;
        return NULL;

    }
    TreeNode* node = new TreeNode(str[p]);
    p += 2;
    node->left = DeSerialByPre(str);
    node->right = DeSerialByPre(str);
    return node;
}

int main()
{
    char* str = "8!6!5!#!#!7!#!#!6!7!#!#!5!#!#!";
    TreeNode* root;
    root = DeSerialByPre(str);

    cout<<isSymmetrical(root);
#ifdef debug_
#else
#endif
    return 0;
}

解法2:前序遍歷與對稱前序遍歷

bool isSymmetrical(TreeNode* pRoot1, TreeNode* pRoot2)
{
    if (pRoot1 == NULL && pRoot2 == NULL)
    {
        return true;
    }
    if (pRoot1 == NULL || pRoot2 == NULL)
    {
        return false;
    }
    if (pRoot1->val != pRoot2->val)
    {
        return false;
    }
    return isSymmetrical(pRoot1->left, pRoot2->right) && isSymmetrical(pRoot1->right, pRoot2->left);
}

bool isSymmetrical(TreeNode* pRoot)
{
    return isSymmetrical(pRoot, pRoot);
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章