首页 > 代码库 > 由后序遍历结果构造二叉查找树

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

<style></style>

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

  例如一棵树后序遍历是这样(下图的树):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(后序遍历的结果)以及运行结果:

 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_DEBUG11 12 struct Node13 {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 =http://www.mamicode.com/ arr.back();27     pNode->data =http://www.mamicode.com/ 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         else43             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_DEBUG52     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 #endif60 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

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




 

题目:

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

分析:

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

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