zoukankan      html  css  js  c++  java
  • 【100题】第十五题(树的镜像问题)

    一,题目:输入一颗二元查找树,将该树转换为它的镜像,即在转换后的二元查找树中,左子树的结点都大于右子树的结点。用递归循环两种方法完成树的镜像转换。  
           例如输入:
                  8
                /    \
              6    10
            /  \    /   \ 
          5   7 9   11

          输出:
                8
              /    \
            10     6
            /   \    /  \  
         11  9   7   5

    定义二元查找树的结点为:
    struct BSTreeNode // a node in the binary search tree (BST)
    {
      int m_nValue; // value of node
      BSTreeNode *m_pLeft; // left child of node
      BSTreeNode *m_pRight; // right child of node
    };

    二,分析:

           采用递归方法,比较简单。主要是采用循环方法时候采用压栈的方式来模拟递归

    三,源码(递归):

    #include"stdio.h"
    #include"malloc.h"
    
    struct node
    {
    	int data;
    	node *right;
    	node *left;
    };
    node *root;
    void insert(node *&root,int data)
    {	
    	if(root==NULL)
        {
    	    	printf("%d\n",data);   
                root=(node*)malloc(sizeof(node)); 
    	    	root->data=data;
    	        root->right=NULL;
    	        root->left=NULL;
    	}
        else
        {    
        	if(root->data<data)//要插入的数据 data大于节点 则插入右边 
                insert(root->right,data);
            else
                insert(root->left,data);
        }
    }
    node *creatTree(int a[],int n)
    {   
        int i;   	 	 	
    	for(i=0;i<n;i++)	 			    	
    	    insert(root,a[i]);	
    	return root;
    }
    void outPut(node *root)//先序遍历树 
    {
    	if(root==NULL)
           return;
    	else//不是空
    	{
            printf("data=%d\n",root->data);
    		outPut(root->left);
    		outPut(root->right); 
    	} 	
    }
    void Revertsetree(node *&root)//获取二叉查找树的镜像 
    {
        if(!root)
           return;
        node *p;
        p=root->left;
        root->left=root->right;
        root->right=p;
        
        if(root->left)
          Revertsetree(root->left);
        if(root->right)
          Revertsetree(root->right);
    }
    int main()
    {
    	int a[]={8,6,5,7,10,9,11};
    	root=creatTree(a,7);
        Revertsetree(root);
    	outPut(root);
    	return 0;
    } 
    
    源码(循环):

    #include "stdio.h"
    #include "malloc.h"
    #include "stack.h"
    struct node
    {
    	int data;
    	node *right;
    	node *left;
    };
    node *root;
    void insert(node *&root,int data)
    {	
    	if(root==NULL)
        {
    	    	printf("%d\n",data);   
                root=(node*)malloc(sizeof(node)); 
    	    	root->data=data;
    	        root->right=NULL;
    	        root->left=NULL;
    	}
        else
        {    
        	if(root->data<data)//要插入的数据 data大于节点 则插入右边 
                insert(root->right,data);
            else
                insert(root->left,data);
        }
    }
    node *creatTree(int a[],int n)
    {   
        int i;   	 	 	
    	for(i=0;i<n;i++)	 			    	
    	    insert(root,a[i]);	
    	return root;
    }
    void outPut(node *root)//先序遍历树 
    {
    	if(root==NULL)
           return;
    	else//不是空
    	{
            printf("data=%d\n",root->data);
    		outPut(root->left);
    		outPut(root->right); 
    	} 	
    }
    void Revertsetree(node *&phead)//采用循环的方式 
    {
        if(!phead)
           return;
        stack<node*> stacklist;
        stacklist.push(phead);         //首先把树的头结点放入栈中。
        while(stacklist.size())
        //在循环中,只要栈不为空,弹出栈的栈顶结点,交换它的左右子树
        {
          node* pnode=stacklist.top(); 
          stacklist.pop();
       
          node *ptemp;
          ptemp=pnode->left;
          pnode->left=pnode->right;
          pnode->right=ptemp;
          if(pnode->left)
            stacklist.push(pnode->left);   //若有左子树,把它的左子树压入栈中
          if(pnode->right)
            stacklist.push(pnode->right);  //若有右子树,把它的右子树压入栈中
        }
    }
    
    int main()
    {
    	int a[]={8,6,5,7,10,9,11};
    	root=creatTree(a,7);
            Revertsetree(root);//采用循环的方式 
    	outPut(root);
    	return 0;
    } 
    



  • 相关阅读:
    pyspark 基本api使用说明(一)
    584. 寻找用户推荐人
    Spring IOC 容器源码分析(了解模板方法--钩子方法在spring中的使用)
    Mybatis事务创建和管理
    Mybatis源码分析执行流程总结
    设计模式之责任链模式
    设计模式之外观模式(门面模式)以及如何利用到接口设计中
    如何在聚合支付平台,巧用模板+工厂设计模式来实现异步回调
    浅谈设计模式之代理设计模式
    Java线上问题排查思路
  • 原文地址:https://www.cnblogs.com/secbook/p/2655047.html
Copyright © 2011-2022 走看看