10.28(429. N叉树的层序遍历-----107. 二叉树的层次遍历 II)

429. N叉树的层序遍历(通过)

思路:层序遍历

效率:77.41%

程序代码:

class Solution {
public:
	vector<vector<int>> levelOrder(Node* root) {
		vector<vector<int>> result;
		if (!root) return result;
		vector<int> vec;
		queue<Node*> qu;
		qu.push(root);
		while (!qu.empty()) {
			vec.clear();
			int n = qu.size();
			for (int i = 0; i < n; i++) {
				Node* tmp = qu.front();
				vec.push_back(tmp->val);
				qu.pop();
				vector<Node*> a = tmp->children;
				for (auto e : a)
					qu.push(e);
			}
			result.push_back(vec);
		}
		return result;
	}

};

简单,没什么需要注意的

107. 二叉树的层次遍历 II(通过)

思路:把上面的存储形式改成堆栈就可以了

效率:36.05%

程序代码:

class Solution {
public:
	vector<vector<int>> levelOrderBottom(TreeNode* root) {
		vector<vector<int>> result;
		stack<vector<int>> st;
		if (!root) return result;
		vector<int> vec;
		queue<TreeNode*> qu;
		qu.push(root);
		while (!qu.empty()) {
			vec.clear();
			int n = qu.size();
			for (int i = 0; i < n; i++) {
				TreeNode* tmp = qu.front();
				vec.push_back(tmp->val);
				qu.pop();
				if(tmp->left)
				qu.push(tmp->left);
				if(tmp->right)
				qu.push(tmp->right);
				
			}
			st.push(vec);
		}
		while (!st.empty()) {
			result.push_back(st.top());
			st.pop();
		}
		return result;
	}

};

优秀代码参考:

class Solution {
public:
    vector<vector<int>> levelOrderBottom(TreeNode* root) {
        queue<TreeNode *> queue;
        queue.push(root);
        vector<vector<int>> result;
        if(!root)
            return result;
        while(!queue.empty()){
            int n = queue.size();
            vector<int> level;
            for(int i =0;i<n;i++){
                TreeNode* p=queue.front();
                queue.pop();
                if(p->left)
                    queue.push(p->left);
                if(p->right)
                    queue.push(p->right);
                level.push_back(p->val);
            }
            result.insert(result.begin(),level);
        }
    return result;
    }
};

不使用堆栈而是直接使用向量的插入,更改程序再亲自实现一下~
效率果然是100%

补充知识点,对向量实现插入之后向量的指针如何变化呢??

测试程序:

int main() {
	vector<int> a;
	a.push_back(1);
	while (1) {
		int n;
		cin >> n;
		if (n == 0)
			break;
		vector<int>::iterator ptr=a.insert(a.begin(),n);
		cout<<*a.begin()<<endl;
	}
	
	return 0;

}

经过测试发现返回的指针始终会指向向量的第一个元素

猜你喜欢

转载自blog.csdn.net/the_little_fairy___/article/details/84394126