刷题--二叉树(2)

Posted 2333wzl

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了刷题--二叉树(2)相关的知识,希望对你有一定的参考价值。

二叉树结构变化

例 lintcode 453. Flatten Binary Tree to Linked List https://www.lintcode.com/problem/flatten-binary-tree-to-linked-list/

traversal :因为是按照前序遍历的顺序将其转换结构,所以就按照前序遍历进行递归,全局变量是root根节点,每进行一次前序遍历就进行一次结构的变换。这里会出现后效性的问题,也体现了对于二叉树问题,首先考虑分治解决。

 

divide conquer :二叉树问题用分治法的思路就是考虑这棵树在问题的答案上和左右子树在答案上有什么关系。先考虑如果左右子树已经返回了结果,根需要怎么操作。左子树的尾节点需要指向右子树的头,根的左子树为null,右孩子指针指向左子树。所以需要知道左子树的尾节点。因为最终不需要返回值,所以recursion函数的返回值就可以是尾节点。当左子树尾节点不为空的时候,就进行一次变换。返回的时候,首先判断右子树的尾节点是否为空,不为空就返回。之后是左子树尾节点判断,最后剩下的情况返回root。recursion的结束是root == null。

public class Solution {
    /**
     * @param root: a TreeNode, the root of the binary tree
     * @return: nothing
     */
    public void flatten(TreeNode root) {
        helper(root);
    }
    
    public TreeNode helper(TreeNode root){
        if(root == null)return null;
    
        TreeNode leftLast = helper(root.left);
        TreeNode rightLast = helper(root.right);
        
        if(leftLast != null){
            leftLast.right = root.right;
            root.right = root.left;
            root.left = null;
        }
     
        if(rightLast != null){
            return rightLast;
        }
        
        if(leftLast != null){
            return leftLast;
        }
    
        return root;
    }
}

 

以上是关于刷题--二叉树(2)的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode刷题日记精选例题(代码+链接)

LeetCode刷题笔记-数据结构-day18

LeetCode刷题笔记-数据结构-day18

LeetCode刷题笔记-数据结构-day18

java刷题--226翻转二叉树

LeetCode刷题 -- 二叉树练习篇