二叉树的镜像

这里写图片描述

  • 最近迷上了二叉树,昨天我写了子树判断,发现用判断和递归去处理二叉树是很好理解的方式,至少对于我是这样的。考虑左右子树为空与否设置判断条件,如果为空,则赋值给对称的节点然后把不为空的置空,然后注意交换的是树结构,不是节点的值。
 public void Mirror(TreeNode root) {
       /*
         * 递归解决方案,判断左右子树情况
         */
        //如果根为空
        //这里判断root是否为空必须放在前面
        if(root == null||(root.left == null && root.right == null))
        {
            //no operation
        }
        //如果左子树不为空,右为空
        else if(root.left != null && root.right == null)
        {
            root.right = root.left;
            root.left = null;
            root = root.right;
            Mirror(root);
        }
        //如果右子树不为空,左为空
        else if(root.right != null && root.left == null)
        {
            root.left = root.right;
            root.right = null;
            root = root.left;
            Mirror(root);
        }
        //如果左右都不为空
        else if(root.left != null && root.right != null)
        {
            //交换左右子节点,注意这里不是交换值,而是交换树
            TreeNode temp = root.left;
            root.left = root.right;
            root.right = temp;
            Mirror(root.right);
            Mirror(root.left);
        }
    }
  • 最开始犯了很低级的错误把后面的判断只写了if并没有写else if 导致程序运行了多余的代码造成结果的错误。
  • 写习惯了,用一个引用去指代节点,也就是如下方式,我感觉更加的清晰。
/*
         * 递归解决方案,判断左右子树情况
         */
        TreeNode p = root;//定义指针
        //如果根为空
        //如果为空
        if(p == null)
        {

        }
        else if(p.left == null && p.right == null)
        {
            //no operation
        }
        //如果左子树不为空,右为空
        else if(p.left != null && p.right == null)
        {
            p.right = p.left;
            p.left = null;
            p = p.right;
            Mirror(p);
        }
        //如果右子树不为空,左为空
        else if(p.right != null && p.left == null)
        {
            p.left = p.right;
            p.right = null;
            p = p.left;
            Mirror(p);
        }
        //如果左右都不为空
        else if(p.left != null && p.right != null)
        {
            //交换左右子节点,注意这里不是交换值,而是交换树
            TreeNode temp = p.left;
            p.left = p.right;
            p.right = temp;
            Mirror(p.right);
            Mirror(p.left);
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值