zoukankan      html  css  js  c++  java
  • [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");
    }
    

      

  • 相关阅读:
    mysql、mongodb、redis区别
    Redis面试题
    【开发提效】开发提效技巧
    【代码规范】16条军规
    mysql数据库连接字符串
    mysql数据库连接字符串
    好用的api接口
    node + express + vue
    跨源资源共享(CORS)
    fehelper
  • 原文地址:https://www.cnblogs.com/lautsie/p/3468625.html
Copyright © 2011-2022 走看看