LeetCode144 Binary Tree Preorder Traversal 二叉树的前序遍历

Given a binary tree, return the preorder traversal of its nodes' values.

Example:

Input: [1,null,2,3]
   1
    \
     2
    /
   3

Output: [1,2,3]

题源:here;完整实现:here

思路:

二叉树的前序遍历,根据其定义编程即可:先访问跟,然后左子节点和右子节点。

但是在具体的编程实现上可以有两种方式:

1 通过递归的方式

	vector<int> preorderTraversal(TreeNode* root) {
		vector<int> res;
		if (root != NULL) {
			res.push_back(root->val);
		}
		else return res;

		vector<int> left = preorderTraversal(root->left);
		vector<int> right = preorderTraversal(root->right);

		if(left.size() > 0) res.insert(res.end(), left.begin(), left.end());
		if (right.size() > 0) res.insert(res.end(), right.begin(), right.end());

		return res;
	}

2 通过暂存右节点的方式

	vector<int> preorderTraversal2(TreeNode* root) {
		vector<int> res;
		vector<TreeNode*> s;
		TreeNode* tmp = root;

		while (!s.empty() || tmp) {
			while (tmp) {
				res.push_back(tmp->val);
				s.push_back(tmp->right);
				tmp = tmp->left;
			}

			tmp = s.back();
			s.pop_back();
		}

		return res;
	}

从时间复杂度来看,两种遍历方式是没有太大差别的,都是O(n)的时间复杂度;但是递归的方式消耗的内存多一些,这是因为操作系统在为我们调用递归函数时有额外的一些开销。

猜你喜欢

转载自blog.csdn.net/m0_37518259/article/details/87918429