zoukankan      html  css  js  c++  java
  • 面试题17:二叉树的镜像

    例如:下面两棵树互为镜像


    思路:先序遍历树的每个结点,若遍历到的结点有子节点,则交换它的两个结点。

    代码:

    #include "stdafx.h"
    #include <iostream>
    using namespace std;
    
    struct BinaryTreeNode
    {
    	int m_nValue;
    	BinaryTreeNode *m_pLeft;
    	BinaryTreeNode *m_pRight;
    };
    
    //构造树的镜像
    void Mirror(BinaryTreeNode *pRoot)
    {
       if (pRoot != NULL)
       {
    	   BinaryTreeNode *pTemp = NULL;
           if (pRoot->m_pLeft != NULL || pRoot->m_pRight != NULL)
           {
    		   pTemp = pRoot->m_pLeft;
    		   pRoot->m_pLeft = pRoot->m_pRight;
    		   pRoot->m_pRight = pTemp;
           }
    
    	   if (pRoot->m_pLeft != NULL)
    	   {
    		   Mirror(pRoot->m_pLeft);
    	   }
    
    	   if (pRoot->m_pRight != NULL)
    	   {
    		   Mirror(pRoot->m_pRight);
    	   }
       }
    }
    
    //以先序的方式构建二叉树,输入-1表示结点为空
    void CreateBinaryTree(BinaryTreeNode *&pRoot)
    {
    	int nNodeValue = 0;
    	cin >> nNodeValue;	
    	if (-1 == nNodeValue)
    	{
    		return; 
    	}
    	else
    	{
    		pRoot = new BinaryTreeNode();
    		pRoot->m_nValue = nNodeValue;
    		CreateBinaryTree(pRoot->m_pLeft);
    		CreateBinaryTree(pRoot->m_pRight);
    	}
    }
    
    void PrintInOrder(BinaryTreeNode *&pRoot)
    {
    	if (pRoot != NULL)
    	{
    		PrintInOrder(pRoot->m_pLeft);
    		cout << pRoot->m_nValue << " ";
    		PrintInOrder(pRoot->m_pRight);
    	}
    }
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	BinaryTreeNode *pRoot = NULL;
    	CreateBinaryTree(pRoot);
    	PrintInOrder(pRoot);
    	cout << endl;
        
    	Mirror(pRoot);
    	PrintInOrder(pRoot);
    	cout << endl;
    
    	system("pause");
    	return 0;
    }
    
    


  • 相关阅读:
    结对作业(测试版)
    回答自己的提问
    阅读一个程序员的生命周期有感
    阅读13到17章提出问题
    读8 9 10章提出问题
    5.2 5.3测试与封装
    5.1 四则运算单元测试j
    阅读5.5章6章7章提出疑问
    做汉堡
    阅读第1到第5章过程的疑问
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3206709.html
Copyright © 2011-2022 走看看