题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
///////////////////////////////////////////////////////////////
下午有点晕晕的,感觉不太好,改了改也算是过了,
中序遍历,一开始不知道如何判断是该返回root左边的还是右边的节点,所以加了一个flag判断一下,
如果flag=1,说明对于上一层节点,这是左子树,那么返回root最右边的节点,
如果flag=2,说明对于上一层,这是右子树,那么返回root最左边的节点,
flag=0,说明到了根节点那里,返回最左边的节点就是链表最开始的节点了。
******************************************************************************************
后来我看了解答,发现好像返回谁都行,因为你返回以后,上一层的root节点接收你返回的节点,如果这是左子树返回的,那么找到最后就是要连接的节点了
如果是右子树返回的,那么找到最左边的那个,就是root后面要跟着的节点了。
//还有一些细节比如为空之类的就不提了
1 /**
2 public class TreeNode {
3 int val = 0;
4 TreeNode left = null;
5 TreeNode right = null;
6
7 public TreeNode(int val) {
8 this.val = val;
9
10 }
11
12 }
13 */
14 public class Solution {
15 public TreeNode Convert(TreeNode pRootOfTree) {
16 if(pRootOfTree==null)
17 return null;
18 return helper(pRootOfTree,0);
19 }
20 public TreeNode helper(TreeNode root,int flag)
21 {
22 if(root==null)
23 return null;
24 TreeNode left=helper(root.left,1);
25 if(left==null)
26 root.left=left;
27 else
28 {
29 root.left=left;
30 left.right=root;
31 }
32 TreeNode right=helper(root.right,2);
33 if(right==null)
34 root.right=right;
35 else
36 {
37 root.right=right;
38 right.left=root;
39 }
40 if(flag==1)
41 {
42 TreeNode res=root;
43 while(res.right!=null)
44 res=res.right;
45 return res;
46 }
47 else if(flag==2)
48 {
49 TreeNode res=root;
50 while(res.left!=null)
51 res=res.left;
52 return res;
53 }
54 else
55 {
56 TreeNode res=root;
57 while(res.left!=null)
58 res=res.left;
59 return res;
60 }
61 }
62 }