zoukankan      html  css  js  c++  java
  • 27 二叉树镜像(四-画图让抽象问题形象化)

    题目描述:

    操作给定的二叉树,将其变换为源二叉树的镜像。

    二叉树的镜像定义:源二叉树 
        	    8
        	   /  
        	  6   10
        	 /   / 
        	5  7 9 11
        	镜像二叉树
        	    8
        	   /  
        	  10   6
        	 /   / 
        	11 9 7  5
    

      

    测试用例:

     1)功能测试(普通的二叉树;二叉树的所有节点都没有左子树或者右子树;只有一个节点的二叉树

     2)特殊输入测试(二叉树的根节点为nullptr)

    解题思路:

    1)交换二叉树非叶子节点的左右子树

    /*
    struct TreeNode {
    	int val;
    	struct TreeNode *left;
    	struct TreeNode *right;
    	TreeNode(int x) :
    			val(x), left(NULL), right(NULL) {
    	}
    };*/
    class Solution {
    public:
        void Mirror(TreeNode *pRoot) {
            if(pRoot == nullptr)
                return;
            //不加下面的判断,程序也能通过。加上以后会少执行两个空指针之间的交换步骤。
            if(pRoot->left==nullptr && pRoot->right==nullptr)
                return;
            //返回值是void,因此在原树上镜像
            //交换当前根节点的左右子树
            TreeNode * tempTree = nullptr;
            tempTree = pRoot->left;
            pRoot->left = pRoot->right;
            pRoot->right = tempTree;
            
            if(pRoot->left!=nullptr)
                Mirror(pRoot->left);
            if(pRoot->right!=nullptr)
                Mirror(pRoot->right);
        }
    };
    

    2)不使用临时变量交换,使用函数swap

    class Solution {
    public:
        void Mirror(TreeNode *p) {
        if(p){
                swap(p -> left, p -> right);
                Mirror(p -> left);
                Mirror(p -> right);
            }
        }
    };
    

    3)栈的非递归实现

    class Solution {
    public:
        void Mirror(TreeNode *pRoot) {
            //非递归实现
            if(pRoot==NULL)
                return;
            stack<TreeNode*> stackNode;
            stackNode.push(pRoot);
            while(stackNode.size()){//不为空,说明左右子树至少有一个存在
                TreeNode* tree=stackNode.top();
                stackNode.pop();
                if(tree->left!=NULL || tree->right!=NULL){//至少有一个存在,交换
                    TreeNode *ptemp=tree->left;
                    tree->left=tree->right;
                    tree->right=ptemp;
                }
                if(tree->left)
                    stackNode.push(tree->left);
                if(tree->right)
                    stackNode.push(tree->right);
            }
        }
    };
    

    4)队列的非递归实现 (与栈的非递归原理一样,只是交换的顺序有所不同stack先进后出queue先进先出) 

    void Mirror(TreeNode *pRoot) {
             if (pRoot == NULL)return;
             queue<TreeNode*> qu;
             TreeNode* p = NULL;
             qu.push(pRoot);
             while (qu.size())
             {
                 p = qu.front();
                 qu.pop();
                 swap(p->left, p->right);
                 if (p->left)qu.push(p->left);
                 if (p->right)qu.push(p->right);
             }
        }
    

      

      

      

  • 相关阅读:
    Swap Nodes in Pairs
    Remove Nth Node From End of List
    Rotate list
    历届试题_DNA比对
    斐波那契字符串_KMP
    字符串的模式匹配
    理解图像Garbor和HOG特征的提取方法及实例应用
    人眼定位和基于人眼的人脸姿态矫正_转载
    借助百度云API进行人脸识别
    { "result": null, "log_id": 304592860300941982, "error_msg": "image check fail", "cached": 0, "error_code": 222203, "timestamp": 1556030094 }
  • 原文地址:https://www.cnblogs.com/GuoXinxin/p/10449553.html
Copyright © 2011-2022 走看看