JZ26 二叉搜索树与双向链表
原题链接
描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。如下图所示

注意:
1.要求不能创建任何新的结点,只能调整树中结点指针的指向。当转化完成以后,树中节点的左指针需要指向前驱,树中节点的右指针需要指向后继 2.返回链表中的第一个节点的指针 3.函数返回的TreeNode,有左右指针,其实可以看成一个双向链表的数据结构
4.你不用输出或者处理,示例中输出里面的英文,比如"From left to right are:"这样的,程序会根据你的返回值自动打印输出
示例1
输入:{10,6,14,4,8,12,16}
返回值:From left to right are:4,6,8,10,12,14,16;From right to left are:16,14,12,10,8,6,4;
示例2
输入:{5,4,#,3,#,2,#,1}
返回值:From left to right are:1,2,3,4,5;From right to left are:5,4,3,2,1;
说明:
5
/
4
/
3
/
2
/
1
树的形状如上图
思路
主要是中序遍历,然后在遍历结点时更改指针方向。一般来说二叉搜索树的中序遍历结果就已经是一个排序的列表了,但要求是双向链表,所以每次要保存上一个结点。
1 import java.util.Stack;
2
3 public class Solution {
4
5 public static TreeNode Convert(TreeNode root) {
6 if (root == null) return null;
7
8 Stack<TreeNode> stack = new Stack<TreeNode>();
9 TreeNode p = root;//处理的结点
10 TreeNode pre = null;// 用于保存中序遍历序列的上一节点
11 boolean isFirst = true;
12
13 while (p != null || !stack.isEmpty()) {
14 while (p != null) {
15 stack.push(p);
16 p = p.left;
17 }
18 p = stack.pop();
19 if (isFirst) {
20 root = p;// 将中序遍历序列中的第一个节点记为root
21 pre = root;
22 isFirst = false;
23 } else {
24 pre.right = p;// p 是 pre 的后继结点
25 p.left = pre;// pre 是 p 的前驱节点
26 pre = p;
27 }
28 p = p.right;
29 }
30 return root;
31 }
32 }
本文来自博客园,作者:klaus08,转载请注明原文链接:https://www.cnblogs.com/klaus08/p/15099540.html

浙公网安备 33010602011771号