判断是否是相同二叉树&&判断是否是对称树

来源:互联网 发布:五金淘宝店铺表示 编辑:程序博客网 时间:2024/06/15 15:01

LeetCode 100. Same Tree

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 isSameTree(p->left, q->left) && isSameTree(p->right, q->right);        }        return false;    }};
写递归先写最底层,将最底层情况写出,然后再根据逻辑,写出上层到底层的传递方式。

----------------------------------------------------------------------------------------------------------------------------------------------------------

Leetcode 101. Symmetric Tree

Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).

For example, this binary tree [1,2,2,3,4,4,3] is symmetric:

    1   / \  2   2 / \ / \3  4 4  3

But the following [1,2,2,null,3,null,3] is not:

    1   / \  2   2   \   \   3    3

Note:
Bonus points if you could solve it both recursively and iteratively.

提示给出可以用递归和非递归两种方式,先用递归写。

class Solution {public:    bool isSymmetric(TreeNode* root) {      //  TreeNode *cur = root;        if (root == NULL)            return true;        return isMirror(root->left, root->right);    }    bool isMirror(TreeNode *p, TreeNode *q)    {        if (q == NULL && p == NULL)            return true;        if (p == NULL || q == NULL)            return false;        if (p->val == q->val)            return isMirror(p->right, q->left) && isMirror(p->left, q->right);        return false;    }};

在写递归过程中,由于必须分叉,因此增加了一个带2参数的函数来辅助判断。

对于非递归,将二叉树分成两半,则此时思路就是对于左半部分按照从左向右层序遍历;对于右半部分从右向左进行层序遍历。层序遍历采用队列结构,因此构造两个队列。

/** * Definition for a binary tree node. * struct TreeNode { *     int val; *     TreeNode *left; *     TreeNode *right; *     TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public:    bool isSymmetric(TreeNode* root) {      TreeNode *lchild;      TreeNode *rchild;      queue<TreeNode *>p, q;      if (root == NULL)       {          return true;      }      p.push(root->left);      q.push(root->right);             while (!p.empty() && !q.empty())     {         lchild = p.front();         p.pop();         rchild = q.front();         q.pop();         if (lchild == NULL && rchild == NULL)             continue;         if (lchild == NULL || rchild == NULL)             return false;         if (lchild->val != rchild->val)             return false;         p.push(lchild->left);         p.push(lchild->right);         q.push(rchild->right);         q.push(rchild->left);     }        return true;    }};

需要注意的是continue的使用,因为此时队列尚不为空,因此并不能直接return,需要继续判断直到队列为空。



原创粉丝点击