Binary Tree 4 - Compare Tree

1. Symmetric tree - Leetcode 101

Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).
For example, this binary tree is symmetric:
    1
   / \
  2   2
 / \ / \
3  4 4  3
But the following is not:
    1
   / \
  2   2
   \   \
   3    3

递归版本:

bool isSymmetric(TreeNode *root) {
    //递归版本
    if(root == NULL)    return true;
    return isSymmetricCore(root->left, root->right);
}
bool isSymmetricCore(TreeNode *leftNode, TreeNode *rightNode) {
    if(leftNode==NULL && rightNode==NULL) //先处理有个空的这种情况
        return true;
    if(leftNode==NULL || rightNode==NULL)
        return false;
    return (leftNode->val == rightNode->val) &&
            isSymmetricCore(leftNode->left, rightNode->right) &&
            isSymmetricCore(leftNode->right, rightNode->left);
}

迭代:

bool isSymmetric(TreeNode *root) {
    //迭代版本,用队列吧,广度遍历
    if(root == NULL)
        return true;
    if(root->left==NULL && root->right==NULL)
        return true;
    if(root->left==NULL || root->right==NULL)
        return false;
    //下面开始正常处理流程
    queue<TreeNode *> q;
    q.push(root->left);
    q.push(root->right);
    while(!q.empty()) {
        TreeNode *leftNode = q.front();
        q.pop();
        TreeNode *rightNode = q.front();
        q.pop();
        if(leftNode->val != rightNode->val)
            return false;
        if(leftNode->left != NULL) {
            if(rightNode->right == NULL)
                return false;
            q.push(leftNode->left);
            q.push(rightNode->right);
        } else if(rightNode->right != NULL)
            return false;
        if(leftNode->right != NULL) {
            if(rightNode->left == NULL)
                return false;
            q.push(leftNode->right);
            q.push(rightNode->left);
        } else if(rightNode->left != NULL)
            return false;
    }
    return true;    //最终都判断完,才true
}

简化一下逻辑,空的也可以压入queue,就和递归思路一样了,里边就不需要判断4个点了,2个就够了:

bool isSymmetric(TreeNode *root) {
    //迭代版本,用队列吧,广度遍历
    if(root == NULL)
        return true;
    //下面开始正常处理流程
    queue<TreeNode *> q;
    q.push(root->left); //NULL也压入
    q.push(root->right);
    while(!q.empty()) {
        TreeNode *leftNode = q.front();
        q.pop();
        TreeNode *rightNode = q.front();
        q.pop();
        if(leftNode==NULL && rightNode==NULL)
            continue;   //true时,继续判断
        if(leftNode==NULL || rightNode==NULL)   //之后,肯定都不空
            return false;
        if(leftNode->val != rightNode->val)
            return false;
         
        q.push(leftNode->left);
        q.push(rightNode->right);
        q.push(leftNode->right);
        q.push(rightNode->left);
    }
    return true;    //最终都判断完,才true
}

2. Same tree - Leetcode 100

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.
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 false;
    return isSameTree(p->left, q->left) && isSameTree(p->right, q->right);
}

同样的,遍历方案也可:几乎和上边的一模一样

bool isSameTree(TreeNode *p, TreeNode *q) {
    queue<TreeNode *> qnodes;
    qnodes.push(p);
    qnodes.push(q);
    while(!qnodes.empty()) {
        TreeNode *lnode = qnodes.front();
        qnodes.pop();
        TreeNode *rnode = qnodes.front();
        qnodes.pop();
        if(lnode==NULL && rnode==NULL)
            continue;
        if(lnode==NULL || rnode==NULL)
            return false;
        if(lnode->val != rnode->val)
            return false;
         
        qnodes.push(lnode->left);
        qnodes.push(rnode->left);
        qnodes.push(lnode->right);
        qnodes.push(rnode->right);
    }
    return true;
}

3. Subtree

You have two very large binary trees: T1, with millions of nodes, and T2 with hundreds of nodes.
Create an algorithm to decide if T2 is a subtree of T1. 
bool subTree(TreeNode* t1, TreeNode* t2) { 
    if (!t2) return true; 
    if (!t1) return false; 
    if(t1->val == t2->val) 
        if(matchTree(t1,t2)) return true; 
    return subTree(t1->left,t2) || subtree(t1->right,t2); 
} 
bool matchTree(TreeNode* t1, TreeNode* t2) { //helper function
    if(!t1 && !t2) return true; 
    if(!t1 || !t2) return false; 
    if(t1->val != t2->val) return false; 
    return matchTree(t1->left,t2->left) && matchTree(t1->right,t2->right); 
}

4. Tweaked Identical Binary Tree

Check two given binary trees are identical or not. Assuming any number of tweaks are allowed. A tweak is defined as a swap of the children of one node in the tree.
bool isTweakedIdentical(TreeNode* a, TreeNode* b) {
  if(a == NULL && b == NULL)
    return true;
  if(a == NULL || b == NULL)
    return false;
  if(a->val != b->val)
    return false;
  // 一致 或 对称
  return (isTweakedIdentical(a->left, b->left) && isTweakedIdentical(a->right, b->right))
    || (isTweakedIdentical(a->left, b->right) && isTweakedIdentical(a->right, b->left));
}
Loading Disqus comments...
Table of Contents