• 数据结构与算法设计--树的镜像


    题目

    请完成一个函数,输入一个二叉树,该函数输出它的镜像。

    方法分析

    树的镜像,对于很多人来说这个东西可能很陌生,不知道这是个什么东西,未必一下子能够想出来。所以这里在设计算法的时候要利用画图的方式举一些简单的例子去了解题目的规则。

    算法设计

    (1)使用先序的方式遍历这棵二叉树,如果遍历到的结点有子节点,就交换该结点的两个子节点。

    (2)直到遍历完二叉树的所有的非叶子结点,就得到了二叉树的镜像。

    测试用例

    (1)空树(2)只有一个根结点的树(3)单边的二叉树(4)普通的二叉树

    代码实现

    (1)递归方式:

    void Mirror(TreeNode *pRoot) 
    {
    	if(NULL == pRoot)
    		return;
    	
    	swap(pRoot->left, pRoot->right);
    	
    	Mirror(pRoot->left);
    	Mirror(pRoot->right);
    }
    
    void swap(TreeNode* &param1, TreeNode* &param2)
    {
    	TreeNode *ptmp = param1;
    	param1 = param2;
    	param2 = ptmp;
    }
    

      

    (2)循环使用栈方式:

    void Mirror(TreeNode *pRoot) 
    {
    	stack<TreeNode*> s;
    	if(pRoot == NULL)
    		return;
    	
    	TreeNode *ptop = NULL;
    	TreeNode *ptmp = NULL;
    	
    	s.push(pRoot);
    	
    	while(!s.empty())
    	{
    		ptop = s.top();
    		s.pop();
    		
    		ptmp = ptop->left;
    		ptop->left = ptop->right;
    		ptop->right = ptmp;
    		
    		if(ptop->right)
    			s.push(ptop->right);
    		if(ptop->left)
    			s.push(ptop->left);
    	}
    }
    

      

    代码Debug

    利用首页的建立二叉树,打印二叉树的代码测试这个函数,把上面的测试用例跑一遍。

  • 相关阅读:
    C++小知识之Vector用法
    云计算和大数据入门
    C++解析JSON之JsonCPP
    OSS研究
    linux内核--进程地址空间(三)
    学习笔记:修改网吧计费系统
    学习笔记:找回电脑开机密码
    例说C#深拷贝与浅拷贝
    JBossESB教程(一)——开发环境的搭建
    Java集合---ConcurrentHashMap原理分析
  • 原文地址:https://www.cnblogs.com/stemon/p/4641369.html
Copyright © 2020-2023  润新知