二叉搜索树与双向链表Convert() 输入一个BST,递归方法

题目:二叉搜索树与双向链表

要求:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。

 

1一开始我连题目都看不懂,只能想到用中序遍历,但是我不知道该怎么去改中序遍历的代码

2看了大牛的代码,发现我对不能创建任何新的结点有误解,其实可以新建节点eg:TreeNode p = root;但这不是新建,只是新建了节点,指向了这棵树中的某些节点.

而且如果你不建新的指向,这题根本没法做啊

此题中的双向链表可以理解为 1  <---->   2

1.right 为2 

2.left为1

思路一:非递归的方法

 

 1 import java.util.*;
 2 /**
 3 public class TreeNode {
 4     int val = 0;
 5     TreeNode left = null;
 6     TreeNode right = null;
 7     public TreeNode(int val) {
 8         this.val = val;
 9     }
10 }
11 */
12 public class Solution {
13     public TreeNode Convert(TreeNode root) {
14         //考虑特殊情况
15         if(root==null) return null;
16         //中序遍历只需一个指针,指向从堆栈中pop出来的即可.但题目要求是双向链表,所以肯定需要再设置一个指针
17         TreeNode cur = root;
18         TreeNode pre = null;
19         //初始化堆栈
20         Stack<TreeNode> stack = new Stack<TreeNode>();
21         boolean init = true;//在实际过程中,这个true只会用来初始化双向链表的头结点,初始完后的所有过程都是false
22         while( !stack.empty() || cur!= null){
23             //一次入栈,直到最左边的点入栈
24             while(cur!= null){
25                 stack.push(cur);
26                 cur= cur.left;
27             }
28             cur = stack.pop();
29             if(init==true){//对应上方21行代码
30                 root = cur; //赋值给root之后,就不能再对root节点进行操作,因为最终要返回root,防止被覆盖.剩下的用cur和pre节点进行操作
31                 pre = root;
32                 init = false;//初始化后,init也就没用了,设置为false
33             }else{//生成双向链表
34                 pre.right = cur;
35                 cur.left = pre;
36                 pre = cur;
37             }
38             cur= cur.right;
39         }
40         return root;
41     }
42 }

 

思路二:递归的方法(todolist)

本地编译器代码(TODOlist)

 

上一篇:图解二叉树节点的查找,插入和删除操作


下一篇:LeetCode 510. Inorder Successor in BST II