Flatten Binary Tree to Linked List:二叉树变更结构

来源:互联网 发布:淘宝仿真金属狙击枪 编辑:程序博客网 时间:2024/05/23 16:36

Given a binary tree, flatten it to a linked list in-place.

For example,
Given

         1        / \       2   5      / \   \     3   4   6

The flattened tree should look like:
   1    \     2      \       3        \         4          \           5            \             6

click to show hints.

Hints:

If you notice carefully in the flattened tree, each node's right child points to the next node of a pre-order traversal.

思路:给的提示一目了然,按先序遍历,然后变更节点结构。

/** * Definition for a binary tree node. * public class TreeNode { *     int val; *     TreeNode left; *     TreeNode right; *     TreeNode(int x) { val = x; } * } */class Solution {    public void dfs(TreeNode n,List<TreeNode> l){        if(n == null) return;        l.add(n);        dfs(n.left,l);               dfs(n.right,l);    }        public void flatten(TreeNode root) {        if(root == null) return;        TreeNode p = root;        ArrayList<TreeNode> l = new ArrayList<TreeNode>();        dfs(root,l);        p.left = p.right = null;        for(TreeNode n:l){           if(n!=root){               p.right = n;               p.left = null;               p = p.right;           }        }        p.right = null;        p.left = null;    }}

然而有更简洁的代码。如果先右后左再笨神的遍历,得到的结果正好是先序的倒转,而且可以直接在遍历的时候调整,更简洁!

private TreeNode prev = null;public void flatten(TreeNode root) {    if (root == null)        return;    flatten(root.right);    flatten(root.left);    root.right = prev;    root.left = null;    prev = root;}
第二种方法参考https://leetcode.com/problems/flatten-binary-tree-to-linked-list/discuss/




阅读全文
0 0