码迷,mamicode.com
首页 > 其他好文 > 详细

由后序遍历结果构造二叉查找树

时间:2014-08-25 22:38:44      阅读:304      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   os   io   for   ar   2014   

  二叉查找树通俗说就是左孩子比父亲小,右孩子比父亲大。构造这么一个树,树嘛,递归即可。

  例如一棵树后序遍历是这样(下图的树):2 9 8 16 15 10 25 38 42 45 30 20。最后的20肯定是树根,这里要抓住一个规律:20是树根,那么2 9 8 16 15 10都是左子树,25 38 42 45 30在右子树,因为左边都小于根、右边都大于根嘛。然后递归即可。

  下面是树的样子和代码和src.txt(后序遍历的结果)以及运行结果:

bubuko.com,布布扣

 1 #include <iostream>
 2 #include <vector>
 3 #include <fstream>
 4 
 5 using std::cin;
 6 using std::cout;
 7 using std::endl;
 8 using std::vector;
 9 
10 #define MY_DEBUG
11 
12 struct Node
13 {
14     int data;
15     Node* pLC;
16     Node* pRC;
17 };
18 
19 Node* creatBSTree(vector<int>& arr)
20 {
21     //数组里面没有元素
22     if (!arr.size())
23         return nullptr;
24 
25     Node* pNode = new Node;
26     int thisData = arr.back();
27     pNode->data = thisData;
28 
29     //只有一个元素就不要折腾了,它就是叶子节点,它没有左右孩子
30     if (1 == arr.size())
31     {
32         pNode->pLC = pNode->pRC = nullptr;
33         return pNode;
34     }
35 
36     //下面找出左半边
37     vector<int> arrLeft;
38     for (int i = 0; i < arr.size() - 1; i++)
39     {
40         if (arr[i] < thisData)
41             arrLeft.push_back(arr[i]);
42         else
43             break;
44     }
45 
46     //下面找出右半边
47     vector<int> arrRight;
48     for (int i = arrLeft.size(); i < arr.size() - 1; i++)
49         arrRight.push_back(arr[i]);
50 
51 #ifdef MY_DEBUG
52     for (int i = 0; i < arrLeft.size(); i++)
53         cout << arrLeft[i] << " ";
54     cout << endl;
55 
56     for (int i = 0; i < arrRight.size(); i++)
57         cout << arrRight[i] << " ";
58     cout << endl << endl;
59 #endif
60 
61     //递归处理左右孩子。arrLeft和arrRight可能为空,不要紧,在函数的开头处理了
62     pNode->pLC = creatBSTree(arrLeft);
63     pNode->pRC = creatBSTree(arrRight);
64 
65     return pNode;
66 }
67 
68 
69 //中序遍历
70 void show(Node* pNode)
71 {
72     if (!pNode)
73         return;
74 
75     show(pNode->pLC);
76     cout << pNode->data << "  ";
77     show(pNode->pRC);
78 }
79 
80 int main(void)
81 {
82     vector<int> arr;
83     std::ifstream fin("src.txt");
84 
85     int temp;
86     while (fin >> temp)
87         arr.push_back(temp);
88 
89     Node* pHead = creatBSTree(arr);
90     show(pHead);
91     cout << endl;
92     cin.get();
93 }
2 9 8 16 15 10 25 38 42 45 30 20

bubuko.com,布布扣

  由其他的遍历方式得到树的道理类似。




 

题目:

  输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。如果是返回true,否则返回false。

分析:

  这不是很简单了嘛,由最后的根把输入分成三份,第一份是左孩子,第二份是右孩子,最后是树根。7、4、6、5就不能构成了,因为5是根,那么7,4,6都是右子树里面的,但是里面有小于5的4,所以不行。递归即可。

由后序遍历结果构造二叉查找树

标签:style   blog   http   color   os   io   for   ar   2014   

原文地址:http://www.cnblogs.com/jiayith/p/3935895.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!