博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【LeetCode】107. Binary Tree Level Order Traversal II (2 solutions)
阅读量:7056 次
发布时间:2019-06-28

本文共 2811 字,大约阅读时间需要 9 分钟。

Binary Tree Level Order Traversal II

Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from left to right, level by level from leaf to root).

For example:

Given binary tree {3,9,20,#,#,15,7},

3   / \  9  20    /  \   15   7

 

return its bottom-up level order traversal as:

[  [15,7],  [9,20],  [3]]

 

confused what "{1,#,2,3}" means? 

OJ's Binary Tree Serialization:

The serialization of a binary tree follows a level order traversal, where '#' signifies a path terminator where no node exists below.

Here's an example:

1  / \ 2   3    /   4    \     5
The above binary tree is serialized as 
"{1,2,3,#,#,4,#,#,5}".
 
解法一:递归
参考了Discussion中stellari的做法,递归进行层次遍历,并将每个level对应于相应的vector。
/** * Definition for binary tree * struct TreeNode { *     int val; *     TreeNode *left; *     TreeNode *right; *     TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution{public:    vector
> result; void levelTra(TreeNode *root, int level) { if(root == NULL) return; if(level == result.size()) { vector
v; result.push_back(v); } result[level].push_back(root->val); levelTra(root->left, level+1); levelTra(root->right, level+1); } vector
> levelOrderBottom(TreeNode *root) { levelTra(root, 0); return vector
>(result.rbegin(), result.rend()); }};

 

解法二:普通层次遍历后逆序。

/** * Definition for binary tree * struct TreeNode { *     int val; *     TreeNode *left; *     TreeNode *right; *     TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ struct Node{    TreeNode* tNode;    int level;    Node(TreeNode* newtNode, int newlevel): tNode(newtNode), level(newlevel) {}};class Solution {public:    vector
> levelOrderBottom(TreeNode *root) { vector
> ret; if(!root) return ret; // push root Node* rootNode = new Node(root, 0); queue
Nqueue; Nqueue.push(rootNode); vector
cur; int curlevel = 0; while(!Nqueue.empty()) { Node* frontNode = Nqueue.front(); Nqueue.pop(); if(frontNode->level > curlevel) { ret.push_back(cur); cur.clear(); curlevel = frontNode->level; } cur.push_back(frontNode->tNode->val); if(frontNode->tNode->left) { Node* leftNode = new Node(frontNode->tNode->left, frontNode->level+1); Nqueue.push(leftNode); } if(frontNode->tNode->right) { Node* rightNode = new Node(frontNode->tNode->right, frontNode->level+1); Nqueue.push(rightNode); } } ret.push_back(cur); reverse(ret.begin(), ret.end()); return ret; }};

转载地址:http://eoool.baihongyu.com/

你可能感兴趣的文章
C# Azure-让http自动跳转到https链接
查看>>
寻找符合条件的整数
查看>>
一:依使初衷
查看>>
Linux设备驱动之USB
查看>>
Active Desktop--桌面字体背景被修改
查看>>
网页中自动获取访问用户所在城市的接口插件
查看>>
锋利jquery第三章案例 总结
查看>>
Cocos Creator Animation 组件
查看>>
RH033读书笔记(1)-Lab2 Linux Usage Basics
查看>>
window对象 (浏览器对象模型)
查看>>
Loadrunner 关于参数赋值取值的操作
查看>>
C# 实现保留两位小数的方法
查看>>
Http协议4个新的http状态码:428、429、431、511;
查看>>
C#类型简述
查看>>
Go:字符串操作
查看>>
EXCEL 2010学习笔记 —— VLOOKUP函数 嵌套 MATCH 函数
查看>>
android graphics: 2D animation
查看>>
升级 python 2.6.6 系统到 2.7.10 版本
查看>>
start with connect by prior 递归查询用法
查看>>
OS X 10.11 安装Cocoapods
查看>>