[mock]12月11日

给出一个二叉搜索树的先序遍历,要求重新构造出这个二叉搜索树。一开始给出了一个递归的算法,指出复杂度有更优的解法。然后想出来一个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");
}

  

posted @ 2013-12-11 09:15  阿牧遥  阅读(195)  评论(0编辑  收藏  举报