【面試題 17.12】BiNode

題目

題目鏈接

二叉樹數據結構TreeNode可用來表示單向鏈表(其中left置空,right爲下一個鏈表節點)。實現一個方法,把二叉搜索樹轉換爲單向鏈表,要求值的順序保持不變,轉換操作應是原址的,也就是在原始的二叉搜索樹上直接修改。

返回轉換後的單向鏈表的頭節點。

注意:本題相對原題稍作改動
示例:

輸入: [4,2,5,1,3,null,6,0]
輸出: [0,null,1,null,2,null,3,null,4,null,5,null,6]

提示:

節點數量不會超過 100000。

解題思路

中序遍歷得出遞增節點序列。利用頭插法將遞增序列節點構建成單鏈表,單鏈表的每個節點做孩子爲null。

代碼

/**
 * @description: BiNode
 * @Author MRyan
 * @Date 2020/6/17 21:47
 * @Version 1.0
 */

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
 
    public List<TreeNode> lists = new ArrayList<>();

    public TreeNode convertBiNode(TreeNode root) {
        //防止給定的二叉樹爲空 list獲取IndexOutOfBoundsException
        if(root==null){
            return null;
        }
        //中序遍歷 獲得遞增節點序列
        solve(root);
        //頭結點爲list的第一個元素
        TreeNode head = lists.get(0);
        //頭結點的做孩子爲空 滿足題目要求
        head.left = null;
        TreeNode current = head;
        //頭結點已經確定所以除去list第一個元素 利用頭插法構建單鏈表
        for (int i = 1; i < lists.size(); i++) {
            current.right = lists.get(i);
            lists.get(i).left = null;
            current = current.right;
        }
        return head;
    }

    public void solve(TreeNode root) {
        if (root == null) {
            return;
        }
        solve(root.left);
        lists.add(root);
        solve(root.right);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章