二叉搜索树的特点是根据中序遍历就是从小到大的顺序。所以要根据左->根->右的顺序进行递归。整体思路就是:按着中序遍历的顺序将树中的每一个结点与前一个结点连接起来。
递归的时候想一个问题,只要能把两个节点连起来,就能把所有的树的结点连起来。这个题还是很典型。
在表示尾结点的时候,我还在想这个使用一个指针不也可以吗,结果调试了发现不行。因位如果使用指针表示尾结点,则在递归的过程中不会更新这个尾结点的值。具体来说,就是在递归中,如果进入一个一个递归循环,则原先未完成的函数的参数会被暂存下来,等递归结束之后再把这个暂存的状态拿出来计算。但是在这个题中,我们不希望将尾结点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 }