題目
二叉樹數據結構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);
}
}