LeetCode 二叉树的层次遍历II

给定一个二叉树,返回其节点值自底向上的层次遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)

例如:

给定二叉树 [3,9,20,null,null,15,7],
    3
   / \
  9  20
    /  \
   15   7
返回其自底向上的层次遍历为:
[
  [15,7],
  [9,20],
  [3]
]

请先翻阅 LeetCode 二叉树的层次遍历
此道题与上一题基本一样,就是层次遍历后将结果转换为逆序的即可。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
	vector> levelOrderBottom(TreeNode* root) {
		vector> result;
		queue myQueue;//辅助队列,用于层次遍历
		if (root == NULL) {
			return result;
		}
        //下面是正常的层次遍历算法
		myQueue.push(root);
		TreeNode *tempNodePtr = NULL;
		while (!myQueue.empty()) {
			int tempQueueSize = myQueue.size();//此时栈的大小(即将访问的层的节点数目)
			vector tempRec;
			for (int i = 0; i < tempQueueSize; ++i) {//将此层的所有节点出队列
				tempNodePtr = myQueue.front();//获取队头
				myQueue.pop();
				tempRec.push_back(tempNodePtr->val);//记录val值
				if (tempNodePtr->left != NULL) {//放置左子树根节点
					myQueue.push(tempNodePtr->left);
				}
				if (tempNodePtr->right != NULL) {//放置右子树根节点
					myQueue.push(tempNodePtr->right);
				}
			}
			result.push_back(tempRec);//将此层的val结果放入结果容器
		}
        //返回结果前进行调换
		return vector>(result.rbegin(), result.rend());//将顺序的访问结果集合调换
	}
};

LeetCode 二叉树的层次遍历II_第1张图片

你可能感兴趣的:(LeetCode)