二叉树解题(二)

Leetcode 226._翻转二叉树

        // 方法一:遍历二叉树
        public TreeNode InvertTree(TreeNode root)
        {
            // 遍历二叉树,交换每个节点的子节点
            Traverse(root);
            return root;
        }
        // 二叉树遍历函数
        void Traverse(TreeNode root) {
            if (root == null) return;
            // 每一个节点需要做的事就是交换它的左右子节点
            TreeNode tmp = root.left;
            root.left = root.right;
            root.right = tmp;
            // 遍历框架,去遍历左右子树的节点
            Traverse(root.left);
            Traverse(root.right);
        }

        // 方法二:递归函数分解问题
        public TreeNode InvertTree(TreeNode root)
        {
            if (root == null) return root;
            // 翻转左右子树
            TreeNode left = InvertTree(root.left);
            TreeNode right = InvertTree(root.right);
            // 交换左右子节点
            root.left = right;
            root.right = left;
            // 以 root 为根的这棵二叉树已经被翻转,返回 root
            return root;
        }

Leetcode 116._填充每个节点的下一个右侧节点指针

        public Node Connect(Node root)
        {
            if (root == null) return null;
            Traverse(root.left,root.right);
            return root;
        }
        void Traverse(Node left,Node right)
        {
            if (left == null|| right == null) return;
            // 将传入的两个节点穿起来
            left.next = right;
            // 连接相同父节点的两个子节点
            Traverse(left.left,left.right);
            Traverse(right.left, right.right);
            // 连接跨越父节点的两个子节点
            Traverse(left.right, right.left);
        }

Leetcode 114._二叉树展开为链表

        public void Flatten(TreeNode root)
        {
            if (root == null) return;
            Traverse(root);
        }
        void Traverse(TreeNode root)
        {
            if (root == null) return;
            // 遍历拉平左右子树
            Traverse(root.left);
            Traverse(root.right);
            // 后序位置
            TreeNode left = root.left;
            TreeNode right = root.right;
            // 将左子树作为右子树
            root.left = null;
            root.right = left;
            // 将右子树添加到当前右子树末尾
            TreeNode p = root;
            while (p.right!=null)
            {
                p = p.right;
            }
            p.right = right;
        }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值