• 二叉树的镜像



    • 题目描述:

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

    • 分析:

      这个题目相对简单,既然是镜像,只要把左右交换就好了。在遍历二叉树的过程中,每遍历一个根结点,交换其左右子结点即可。显然涉及二叉树的遍历应该使用递归,接下来应该考虑的是递归的终止条件,以及程序的鲁棒性:直到遍历的结点左右子结点都为空即止。鲁棒性上需要注意的是输入为空指针的情况。

      递归版本:

      void Mirror(TreeNode *pRoot) {
          if(pRoot == NULL) return;
      	if(pRoot->left == NULL && pRoot->right == NULL)
              return;
          
          TreeNode *pNode = NULL;
          pNode = pRoot->left;
          pRoot->left = pRoot->right;
          pRoot->right = pNode;
          
          if(pRoot->left != NULL)
          	Mirror(pRoot->left);
          if(pRoot->right != NULL)
              Mirror(pRoot->right);
      }
      

      非递归版本:

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

      注:非递归版本可以使用队列来完成,使用层次遍历的方法。根结点入队,然后遍历队列中的结点,每出队一个结点,交换其左右结点,再将其左右结点入队(即每出队一个结点,交换完成后入队两个子结点)。

  • 相关阅读:
    oracle 创建视图、修改视图、删除视图、利用视图操作基本表
    FileZilla Server的安装和设置
    js网站
    图解局域网共享设置步骤
    PLSQL连接ORACLE详解
    PLSQL Developer图形化窗口创建数据库全过程
    60多个精品源码站
    日历控件
    LINQ 101例子
    SharpZipLib压缩打包多个文件
  • 原文地址:https://www.cnblogs.com/Bill-LHR/p/6807922.html
Copyright © 2020-2023  润新知