对称的二叉树

发布于:2022-12-10 ⋅ 阅读:(241) ⋅ 点赞:(0)

对称的二叉树

在这里插入图片描述

方法一

递归
分别用两个指针L和R分别指向对称的两个子树的对称的结点。
如果L和R均为空,对称,返回true
如果L和R一个为空一个不为空,则不对称,返回false
如果L和R均不为空则判断L和R指向结点的值是否相等,如果不等返回false
如果L和R指向结点的值相等
递归。L指向其左孩子,R指向其右孩子。记录返回值
递归。L指向其右孩子,R指向其左孩子。记录返回值
如果两次返回值都为真返回true,否则返回false。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */


bool check(struct TreeNode* L,struct TreeNode* R){
    if(!L && !R){
        return true;
    }
    else if((!L && R) ||(L && !R)){
        return false;
    }
    else if(L->val == R->val){
    	//如果需要L指向左子树,R指向右子树
    	//将下面两个check交换位置即可
    	//因为第一次LR相同,比较后会造成L和R指向的子树改变。
        if(check(L->left,R->right) && check(L->right,R->left)){
            return true;
        }
        else{
            return false;
        }
    }
    else{
        return false;
    }
}

bool isSymmetric(struct TreeNode* root){
    //第一次传入时会有一次重复比较,因为右子树先右后左,会造成第一次比
    //较过后实际上L是在指向右子树,R指向右子树。
    //如果需要L指向左子树,R指向右子树。
    //只需每次递归L先访问右子树,后访问左子树。
    return check(root,root);
}

根结点分开比较,从而L就是一直指向左子树,R指向右子树。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */


bool check(struct TreeNode* L,struct TreeNode* R){
    if(!L && !R){
        return true;
    }
    else if((!L && R) ||(L && !R)){
        return false;
    }
    else if(L->val == R->val){
        if(check(L->left,R->right) && check(L->right,R->left)){
            return true;
        }
        else{
            return false;
        }
    }
    else{
        return false;
    }
}

bool isSymmetric(struct TreeNode* root){
    if(root){
        return check(root->left,root->right);
    }
    else{
        return true;
    }
}

方法二

迭代
可以用栈,也可以用队列。
先将对应位置的结点压入栈,每次弹栈弹出两个结点。分别用L和R两个指针临时保存。
进行判断,若L和R同时为空则说明分支到底,为叶子结点。所以直接出栈就行。
否则判断L和R是否为一空一不空。如果是则不对称return false。如果都不为空则判断L和R指向的值是否相等,如果则不对称,如果相等则将两个结点的孩子按照对应位置压栈,如L右R左,或者L左R右都可以。总之与弹栈的顺序相反。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
struct Stack{
    struct TreeNode** data;
    int top;
};

int StackPush(struct Stack* S,struct TreeNode* T){
    *(S->data + S->top) = T;
    S->top++;
    return 1;
}

int StackPop(struct Stack* S,struct TreeNode** T){
    S->top--;
    *T = *(S->data + S->top);
    return 1;
}

bool isSymmetric(struct TreeNode* root){
	//先判断根结点是否为空
    if(root){
        struct Stack* S = (struct Stack*)malloc(sizeof(struct Stack));
        S->data = (struct TreeNode**)malloc(sizeof(struct TreeNode*)*1000);
        S->top = 0;
        //如果根结点不为空,将左孩子和右孩子分别压栈
        StackPush(S,root->left);
        StackPush(S,root->right);
        while(S->top){
            struct TreeNode* L;
            struct TreeNode* R;
            StackPop(S,&R);
            StackPop(S,&L);//将一对位置的结点出栈
            if(!(!L && !R)){//如果结点不全为空则进行比较
                if((!L && R) || (L && !R)){//一空一不空,不对称
                	free(S->data);
        			free(S);
                    return false;
                }
                else if(L->val == R->val){//都不空,比较值,相等压栈
                    StackPush(S,L->right);
                    StackPush(S,R->left);
                    StackPush(S,L->left);
                    StackPush(S,R->right);                
                }
                else{//不等,不对称
                	free(S->data);
        			free(S);
                    return false;
                }
            }
        }
        free(S->data);
        free(S);
        return true;
    }
    else{
        return true;
    }
}

//栈的另外表示方法
//用指针表示栈顶

/**
//  * Definition for a binary tree node.
//  * struct TreeNode {
//  *     int val;
//  *     struct TreeNode *left;
//  *     struct TreeNode *right;
//  * };
//  */

// struct Stack{
//     struct TreeNode** data;
//     struct TreeNode** top;
// };

// int StackPush(struct Stack* S,struct TreeNode* T){
//     if(S->top - S->data == 1000){
//         return 0;
//     }
//     else{
//         *S->top = T;
//         S->top++;
//         return 1;
//     }
// }

// int StackPop(struct Stack* S,struct TreeNode** T){
//     if(S->top == S->data){
//         return 0;
//     }
//     else{
//         S->top--;
//         *T = *S->top;
//         return 1;
//     }
// }


// bool isSymmetric(struct TreeNode* root){
//     if(root){
//         struct Stack* S = (struct Stack*)malloc(sizeof(struct Stack));
//         S->data = (struct TreeNode**)malloc(sizeof(struct TreeNode*)*1000);
//         S->top = S->data;
//         StackPush(S,root->left);
//         StackPush(S,root->right);
//         while(S->top != S->data){
//             struct TreeNode* L;
//             struct TreeNode* R;
//             StackPop(S,&R);
//             StackPop(S,&L);
//             if(!(!L && !R)){
//                 if((!L && R) || (L && !R)){
//					   free(S->data);
//					   free(S);
//                     return false;
//                 }
//                 else if(L->val == R->val){
//                     StackPush(S,L->right);
//                     StackPush(S,R->left);
//                     StackPush(S,L->left);
//                     StackPush(S,R->right);
//                 }
//                 else{
//					   free(S->data);
//					   free(S);
//                     return false;
//                 }
//             }
//         }
//		   free(S->data);
//		   free(S);
//         return true;
//     }
//     else{
//         return true;
//     }
// }


队列

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
struct Queue{
    struct TreeNode** data;
    int head;
    int rear;
};

int QueueIn(struct Queue* Q,struct TreeNode* T){
    *(Q->data + Q->rear) = T;
    Q->rear++;
    return 1;
}

int QueueOut(struct Queue* Q,struct TreeNode** T){
    *T = *(Q->data + Q->head);
    Q->head++;
    return 1;
}

bool isSymmetric(struct TreeNode* root){
    if(root){
        struct Queue* Q = (struct Queue*)malloc(sizeof(struct Queue));
        Q->data = (struct TreeNode**)malloc(sizeof(struct TreeNode*)*1000);
        Q->head = 0;
        Q->rear = 0;
        //入队
        QueueIn(Q,root->left);
        QueueIn(Q,root->right);
        while(Q->rear - Q->head){
            struct TreeNode* L;
            struct TreeNode* R;
            QueueOut(Q,&L);
            QueueOut(Q,&R);
            if(!(!L && !R)){
                if((!L && R) || (L && !R)){
  					   free(S->data);
					   free(S);
                    return false;
                }
                else if(L-> val == R->val){
                    QueueIn(Q,L->right);
                    QueueIn(Q,R->left);
                    QueueIn(Q,L->left);
                    QueueIn(Q,R->right);
                }
                else{
                  	free(S->data);
					free(S);
                    return false;
                }
            }
        }
        free(S->data);
        free(S);
        return true;
    }
    else{
        return true;
    }
}

//改良队列

/**
//  * Definition for a binary tree node.
//  * struct TreeNode {
//  *     int val;
//  *     struct TreeNode *left;
//  *     struct TreeNode *right;
//  * };
//  */

// struct Queue{
//     struct TreeNode** data;
//     struct TreeNode** head;
//     struct TreeNode** rear;
// };

// int QueueIn(struct Queue* Q,struct TreeNode* T){
//     if(Q->rear - Q->data == 1000){
//         return 0;
//     }
//     else{
//         *Q->rear = T;
//         Q->rear++;
//         return 1;
//     }
// }

// int QueueOut(struct Queue* Q,struct TreeNode** T){
//     if(Q->rear == Q->head){
//         return 0;
//     }
//     else{
//         *T = *Q->head;
//         Q->head++;
//         return 1;
//     }
// }

// bool isSymmetric(struct TreeNode* root){
//     if(root){
//         struct Queue* Q = (struct Queue*)malloc(sizeof(struct Queue));
//         Q->data = (struct TreeNode**)malloc(sizeof(struct TreeNode*)*1000);
//         Q->head = Q->data;
//         Q->rear = Q->data;

//         QueueIn(Q,root->left);
//         QueueIn(Q,root->right);
//         while(Q->head != Q->rear){
//             struct TreeNode* L;
//             struct TreeNode* R;
//             QueueOut(Q,&L);
//             QueueOut(Q,&R);
//             if(!(!L && !R)){
//                 if((!L && R) || (L && !R)){
//                     free(Q->data);
//                     free(Q);
//                     return false;    
//                 }
//                 else if(L->val == R->val){
//                     QueueIn(Q,L->right);
//                     QueueIn(Q,R->left);
//                     QueueIn(Q,L->left);
//                     QueueIn(Q,R->right);
//                 }
//                 else{
//                     free(Q->data);
//                     free(Q);
//                     return false;
//                 }
//             }
//         }
//         free(Q->data);
//         free(Q);
//         return true;
//     }
//     else{
//         return true;
//     }
// }

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到