标签: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(后序遍历的结果)以及运行结果:
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
由其他的遍历方式得到树的道理类似。
题目:
输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。如果是返回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