zoukankan      html  css  js  c++  java
  • 二叉树的镜像


    • 题目描述:

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

    • 分析:

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

      递归版本:

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

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

  • 相关阅读:
    Git 学习笔记(W,I,P)
    DirectX API 编程起步 #01 项目设置
    #1004 Let the Balloon Rise
    #1003 Max Sum
    人生的第一个博客(●'◡'●)ノ♥--开博典礼
    2053——switch game
    在Activity间传递数据的四种方法及返回结果
    安卓学习第38课——ProgressDialog
    安卓学习第37课——DatePickerDialog、TimePickerDialog
    安卓学习第36课——PopupWindow
  • 原文地址:https://www.cnblogs.com/Bill-LHR/p/6807922.html
Copyright © 2011-2022 走看看