二叉树——验真对称二叉树

原题,如图所示,要求给定一个二叉树的根节点,验证是否对称
节点定义:
struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode() : val(0), left(nullptr), right(nullptr) {} TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} };
1.mine:简单利用对称性,用层序遍历的方式用栈依序处理(下一层的)节点,如果节点为null则特别标记后入栈
左侧入栈,右侧出栈,最后如果stack不为空,那么即非对称。
2.standard:运用双指针,一个指针右移则另一个左移,一个左移则另一个右移。
【递归】
class Solution { public: bool ck(TreeNode *l, TreeNode *r) { if (!l && !r) return true; if (!l || !r) return false; return l->val == r->val && ck(l->left, r->right) && ck(l->right, r->left); } bool isSymmetric(TreeNode *root) { return ck(root, root); } };
【迭代】
用队列模拟递归的双指针,每次入/出队两个元素,进行比较。
class Solution { public: bool isSymmetric(TreeNode *root) { if (!root) return true; queue<TreeNode *> q; TreeNode *x = nullptr, *y = nullptr; q.push(root);q.push(root); while (q.size()) { x = q.front();q.pop(); y = q.front();q.pop(); if (!x && !y) continue; if ((!x || !y) || (x->val != y->val)) return false; q.push(x->left);q.push(y->right); q.push(x->right);q.push(y->left); } return true; } };
analyse:
迭代法,利用队列模拟双指针
首先我们引入一个队列,这是把递归程序改写成迭代程序的常用方法。
初始化时我们把根节点入队两次。
每次提取两个结点并比较它们的值
(队列中每两个连续的结点应该是相等的,而且它们的子树互为镜像),
然后将两个结点的左右子结点按相反的顺序插入队列中。
当队列为空时,
或者我们检测到树不对称(即从队列中取出两个不相等的连续结点)时,该算法结束。

浙公网安备 33010602011771号