给出一个二叉搜索树的先序遍历,要求重新构造出这个二叉搜索树。一开始给出了一个递归的算法,指出复杂度有更优的解法。然后想出来一个O(n)的算法,就是使用一个栈,然后依次判断新的节点比原来的大还是小,然后放入左子树或右子树。
实现过程中,一开始用了class,被指出成员默认是private的,于是马上改用struct。接下来写得一开始还行,但后来发现有bug之后思路有点蒙。经过多次试验,才发现是大于和小于的两个判断调换了,但这时已经很靠后了。另外被指出,可以直接写,new TreeNode(val)这样的,不要先new出来再赋值,这样看起来垃圾代码很多,写起来看起来都不合算。
所以觉得接下来可能要二刷leetcode或着这些bug free的小code练习。
下面是完了之后又调了一下的代码。
#include <vector> #include <stack> #include <iostream> using namespace std; struct TreeNode { int val; TreeNode* left; TreeNode* right; TreeNode(int _val) { val = _val; left = NULL; right = NULL; } }; TreeNode* constructTree(vector<int> &preOrder) { stack<TreeNode*> st; if (preOrder.size() == 0) return NULL; TreeNode* root = new TreeNode(preOrder[0]); st.push(root); for (int i = 1; i < preOrder.size(); i++) { // peek stack if (st.top()->val > preOrder[i]) { TreeNode* tmp = new TreeNode(preOrder[i]); st.top()->left = tmp; st.push(tmp); } else if (st.top()->val <= preOrder[i]) { TreeNode* last = st.top(); st.pop(); while (!st.empty() && st.top()->val <= preOrder[i]) { last = st.top(); st.pop(); } // stack.empty() || stack.top()->val > val TreeNode* tmp = new TreeNode(preOrder[i]); last->right = tmp; st.push(tmp); } } return root; } void printTree(TreeNode* root) { if (root != NULL) { cout << root->val << endl; printTree(root->left); printTree(root->right); } } int main() { vector<int> vec; vec.push_back(6); vec.push_back(3); vec.push_back(1); vec.push_back(5); vec.push_back(4); vec.push_back(9); vec.push_back(10); TreeNode * root = constructTree(vec); printTree(root); system("pause"); }