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);
             }
        }
    

      

      

      

  • 相关阅读:
    关于基于.net的WEB程序开发所需要的一些技术归纳
    技术的学习方法探索之一
    生活,就是让程序为人们服务!
    js滑动提示效果
    radio判断是否为空
    JS清除网页历史记录,屏蔽后退按钮
    多表查询存储过程
    IP地址转化为数字,charindex ,SUBSTRING
    c# byte转化为string
    获得IP地址中文
  • 原文地址:https://www.cnblogs.com/GuoXinxin/p/10449553.html
Copyright © 2011-2022 走看看