二叉树面试题之二叉树镜像

首先分析,互为镜像,也就是说,一个节点的左右子树互相交换位置,因此采用递归的方法较为简单,且方便理解,即镜像步骤:

1).交换根结点的左右子树节点。

2).交换左子树(以图中10为例)的左右节点。

3).交换右子树(以图中6为例)的左右结点。

总结上面过程,一颗树的镜像过程:先前序遍历树的每个节点,如果遍历到节点有子节点,就交换它的两个子节点,当交换完所有非叶子节点的左右子节点之后,就得到了树的镜像。

实现如下:

struct BinaryTreeNode
{
	int value;
	BinaryTreeNode*_left;
	BinaryTreeNode*_right;
};
void Mirror(BinaryTreeNode*Node)
{
	if (Node == NULL)
		return; 
	if (Node->_left == NULL&&Node->_right == NULL)
		return;
	BinaryTreeNode*tmp = Node->_left;
	Node->_left = Node->_right;
	Node->_right = tmp;
	if (Node->_left)
		Mirror(Node->_left);
	if (Node->_right)
		Mirror(Node->_right);
}

//以先序的方式构建二叉树,输入-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);  
    }  
}  

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值