美文网首页
刷题14——面试题27:二叉树的镜像

刷题14——面试题27:二叉树的镜像

作者: 咋家 | 来源:发表于2019-06-29 09:45 被阅读0次

题目:

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

如下图所示,即为两棵互为镜像的二叉树:

思路:

现在我们来仔细分析这两棵树的特点,总结出求镜像的步骤。这两颗树的根节点相同,但它们的左、右两个子节点交换了位置。因此,我们不妨先在树中交换根节点的两个子节点,得到下图的第二棵树。

交换根节点的两个子节点之后,我们注意到值为10、6的节点的子节点仍然保持不变,因此我们还需要交换这两个节点的左、右子节点。交换之后的结果分别是下图的第三棵树和第四棵树。做完这两次交换之后,我们已经遍历完所有的非叶节点。此时变换之后的树刚好就是原始树的镜像。

注:(a)交换根节点的左、右子树;(b)交换值为10的节点的左、右子节点;(c)交换值为6的节点的左、右子节点

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

综上,python代码如下:

class TreeNode:
    def __init__(self, x):
        self.val =x
        self.left =None
        self.right =None
        
class Solution:
    def Mirror(self, root):
        if not root:
            return None
        root.left, root.right =root.right, root.left
        if root.left:
            self.Mirror(root.left)
        if root.right:
            self.Mirror(root.right)

java代码如下:

//二叉树结构定义如下
class BinaryTreeNode{
    public int value;
    public BinaryTreeNode leftNode;
    public BinaryTreeNode rightNode;
    
    public BinaryTreeNode(){
        
    }
    
    public BinaryTreeNode(int value){
        this.value =value;
        this.leftNode =null;
        this.rightNode =null;
    }
}

public class MirrorOfBinaryTree{
    public void Mirror(BinaryTreeNode node){
        if (node ==null)
            return;
        if (node.leftNode ==null && node.rightNode ==null)
            return;
        
        BinaryTreeNode temp =node.leftNode;
        node.leftNode =node.rightNode;
        node.rightNode =temp;
        if(node.leftNode != null)
            Mirror(node.leftNode);
        if(node.rightNode !=null)
            Mirror(node.rightNode);
    }
}

更多精彩,关注“咋家”

image

相关文章

网友评论

      本文标题:刷题14——面试题27:二叉树的镜像

      本文链接:https://www.haomeiwen.com/subject/rkmucctx.html