※剑指offer系列19:二叉搜索树与双向链表

二叉搜索树的特点是根据中序遍历就是从小到大的顺序。所以要根据左->根->右的顺序进行递归。整体思路就是:按着中序遍历的顺序将树中的每一个结点与前一个结点连接起来。

递归的时候想一个问题,只要能把两个节点连起来,就能把所有的树的结点连起来。这个题还是很典型。

在表示尾结点的时候,我还在想这个使用一个指针不也可以吗,结果调试了发现不行。因位如果使用指针表示尾结点,则在递归的过程中不会更新这个尾结点的值。具体来说,就是在递归中,如果进入一个一个递归循环,则原先未完成的函数的参数会被暂存下来,等递归结束之后再把这个暂存的状态拿出来计算。但是在这个题中,我们不希望将尾结点plastnode的值暂存下来,我们希望它随波逐流,运行到哪里就是哪里的结果。因此这是它和头结点指针的区别,使用双重指针恰好可以解决这个问题。所以由此,如果在递归的过程中你所传的指针参数的值要一直变化,可以使用双重指针的方式。二级指针是C语言的写法,在C++中可以使用引用来代替。

 1 #include <iostream>
 2 
 3 using namespace std;
 4 
 5 struct TreeNode {
 6 int val;
 7 struct TreeNode *left;
 8 struct TreeNode *right;
 9 /*
10 TreeNode(int x) :
11 val(x), left(NULL), right(NULL) {
12 }*/
13 };
14 class Solution {
15 public:
16     TreeNode* Convert(TreeNode* pRootOfTree)
17     {
18         if (pRootOfTree == NULL)
19             return NULL;
20         TreeNode*plastnode = NULL;
21         Convertnode(pRootOfTree, &plastnode);
22         while (plastnode != NULL&& plastnode->left!=NULL)//函数没有返回值,只能从尾结点倒着去找头结点
23         {
24             plastnode = plastnode->left;
25         }
26         return plastnode;
27     }
28     void Convertnode(TreeNode* pRootOfTree, TreeNode**  plastnode)//注意,这里在表示末尾结点使用的是指针的指针,因为这样可以在递归的过程中一直更新
29     {
30         //if (pRootOfTree == NULL)
31         //    return;
32         TreeNode *curnode = pRootOfTree;//设置一个当前结点
33 
34         //先找完左子树
35         if (curnode->left != NULL)
36             Convertnode(curnode->left, plastnode);
37 
38         //将结点加入序列中的最后
39         curnode->left=*plastnode;
40         if (*plastnode != NULL)
41             (*plastnode)->right = curnode;//必须加括号,别忘记符号的优先级
42         *plastnode=curnode;
43 
44         //如果有右子树再去递归右子树,将右子树的结点加入序列的尾部
45         if (curnode->right != NULL)
46             Convertnode(curnode->right, plastnode);
47     }
48 };
49 
50 int main()
51 {
52     //       10
53     //  6          14
54     //4   8     12     16
55     TreeNode tree[7];
56     tree[0].val = 10;
57     tree[0].left = &tree[1];
58     tree[0].right = &tree[2];
59     tree[1].val = 6;
60     tree[1].left = &tree[3];
61     tree[1].right = &tree[4];
62     tree[2].val = 14;
63     tree[2].left = &tree[5];
64     tree[2].right = &tree[6];
65     tree[3].val = 4;
66     tree[3].left = NULL;
67     tree[3].right = NULL;
68     tree[4].val = 8;
69     tree[4].left = NULL;
70     tree[4].right = NULL;
71     tree[5].val = 12;
72     tree[5].left = NULL;
73     tree[5].right = NULL;
74     tree[6].val = 16;
75     tree[6].left = NULL;
76     tree[6].right = NULL;
77 
78     Solution solu;
79     TreeNode *head = solu.Convert(tree);
80     while (head != NULL)
81     {
82         cout << head->val << " ";
83         head = head->right;
84     }
85     return 0;
86 }

 

posted @ 2019-06-24 16:56  妮妮熊  阅读(132)  评论(0编辑  收藏  举报