和我一起迎接明天的太阳吧

klaus08

焦虑源于行动的匮乏

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 }

  

 

 

posted @ 2021-08-04 16:33  klaus08  阅读(42)  评论(0)    收藏  举报