leetcode中层次遍历(LevelOrder)的应用

6 篇文章 0 订阅
6 篇文章 0 订阅

        二叉树的层次遍历,是一种很直观的遍历二叉树的方法,应用C++STL的队列很容易实现出来,笔者给出层次遍历(LevelOrder)的代码:

//LevelOrder

/**

* Definition for a binary tree node.

* struct TreeNode {

* int val;

* TreeNode *left;

* TreeNode *right;

* TreeNode(int x) : val(x), left(NULL), right(NULL) {}

* };

*/

void LevelOrder(BTNode*t)

{

queue<BTNode*>Q;

Q.push(t);

while(!Q.empty())

{

BTNode*p=Q.front();//队列中第一个元素

Q.pop();//出队

if(p->left)Q.push(p->left);

if(p->right)Q.push(p->right);

}

}

思路很简单,就是将根节点压入队列,出队后在将对应的左右节点压入队列,实现队列。

<1>现在来看一道leetcode上的算法题:简单描述就是给定一棵二叉树,返回它的最左下节点。

思路:就是应用层次遍历,在每个层次遍历的时候记录下每层的长度,将每层第一个出队的节点记录下来,那么遍历之后就是得到它:

int findBottomLeftValue(TreeNode* root)

{

vector<TreeNode* > queue;

queue.push_back(root);

int front=0;int rear=1;int top=-1;//存放每层最前面的值

while(front!=rear)

{

int LEVEL_SIZE=rear-front;//当前层次的长度

top=queue[front]->val;//此处存放的就是把最后得到的最左下的节点

//将这个层次的树节点全部出队

while(LEVEL_SIZE>0)

{

TreeNode* temp=queue[front];//出队

front++;

LEVEL_SIZE--;

if(temp->left)

{

queue.push_back(temp->left);//入队

rear++;

}

if(temp->right)

{

queue.push_back(temp->right);//入队

rear++;

}

}

}

return(top);

}

利用层次遍历求最下左节点:记录每一层的长度 出队时减一

本体实质就是在原来的层次遍历上进行记录下每层的头结点。

<2>在看另一道leetcode的题目:求出每层的平均值,返回一个vector,岂不是易如反掌

//求每层的平均值

vector<double> averageOfLevels(TreeNode* root)

{

vector<double> average;//存放平均数

vector <TreeNode*> v;

v.push_back(root);

int front=0;

int back=1;

double sum=0.0;

while(front!=back)

{

int size=back-front;

int temp=size;

while(size>0)

{

TreeNode*p=v[front];

front++;//出队

size--;

sum+=p->val;//计数求和

if(p->left) {

//入队

v.push_back(p->left);

back++;

}

if(p->right)

{

v.push_back(p->right);

back++;

}

}

average.push_back( (sum)/temp );//平均数压入

sum=0;//清零

}

return(average);

}

<3>最后在看一道leetcode的求倒序的层次遍历

原题如下:

看似比较复杂 实际就是层次遍历,将每一个层次的节点均存储起来

笔者解法:(前面的实现求了一下树的高度,可能代码不是特别简洁,但是大体思路皆是如此)

//LevelOrder

/**

* 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:

int hight(TreeNode *root)

{

if (root)

return (max(hight(root->left), hight(root->right)) + 1);

else

return (0);

}

//vector不能直接填写

vector<vector<int>> levelOrderBottom(TreeNode *root)

{

if (root)

{

int h = hight(root) - 1; //高度

vector<vector<int>> temp; //正常的顺序压入一个层次的树节点

vector<vector<int>> result;

queue<TreeNode *> node; //levelorder的辅助队列

node.push(root);

while (node.empty() == 0)

{

int width = node.size();//这里便是重点记录下每一个层次的节点的数目,

int i = 0;

vector<int> temp_temp; //申请了一个临时临时的向量

while (width > 0)

{

TreeNode *p = node.front();

temp_temp.push_back(p->val);

node.pop();

width--;

if (p->left)

node.push(p->left);

if (p->right)

node.push(p->right);

} //一个层次均压入队列

temp.push_back(temp_temp);

h--;

}

for (int i = temp.size() - 1; i >= 0; i--)

result.push_back(temp[i]);

return (result);

}

else

{

vector<vector<int>> v;

return (v);

}

}

};

 

 

 

 

G

M

T

 

 

 检测语言世界语中文简体中文繁体丹麦语乌克兰语乌兹别克语乌尔都语亚美尼亚语伊博语俄语保加利亚语信德语修纳语僧伽罗语克罗地亚语冰岛语加利西亚语加泰罗尼亚语匈牙利语南非祖鲁语卡纳达语卢森堡语印地语印尼巽他语印尼爪哇语印尼语古吉拉特语吉尔吉斯语哈萨克语土耳其语塔吉克语塞尔维亚语塞索托语夏威夷语威尔士语孟加拉语宿务语尼泊尔语巴斯克语布尔语(南非荷兰语)希伯来语希腊语库尔德语弗里西语德语意大利语意第绪语拉丁语拉脱维亚语挪威语捷克语斯洛伐克语斯洛文尼亚语斯瓦希里语旁遮普语日语普什图语格鲁吉亚语毛利语法语波兰语波斯尼亚语波斯语泰卢固语泰米尔语泰语海地克里奥尔语爱尔兰语爱沙尼亚语瑞典语白俄罗斯语科萨科西嘉语立陶宛语索马里语约鲁巴语缅甸语罗马尼亚语老挝语芬兰语苏格兰盖尔语苗语英语荷兰语菲律宾语萨摩亚语葡萄牙语蒙古语西班牙语豪萨语越南语阿塞拜疆语阿姆哈拉语阿尔巴尼亚语阿拉伯语韩语马其顿语马尔加什语马拉地语马拉雅拉姆语马来语马耳他语高棉语齐切瓦语

 

世界语中文简体中文繁体丹麦语乌克兰语乌兹别克语乌尔都语亚美尼亚语伊博语俄语保加利亚语信德语修纳语僧伽罗语克罗地亚语冰岛语加利西亚语加泰罗尼亚语匈牙利语南非祖鲁语卡纳达语卢森堡语印地语印尼巽他语印尼爪哇语印尼语古吉拉特语吉尔吉斯语哈萨克语土耳其语塔吉克语塞尔维亚语塞索托语夏威夷语威尔士语孟加拉语宿务语尼泊尔语巴斯克语布尔语(南非荷兰语)希伯来语希腊语库尔德语弗里西语德语意大利语意第绪语拉丁语拉脱维亚语挪威语捷克语斯洛伐克语斯洛文尼亚语斯瓦希里语旁遮普语日语普什图语格鲁吉亚语毛利语法语波兰语波斯尼亚语波斯语泰卢固语泰米尔语泰语海地克里奥尔语爱尔兰语爱沙尼亚语瑞典语白俄罗斯语科萨科西嘉语立陶宛语索马里语约鲁巴语缅甸语罗马尼亚语老挝语芬兰语苏格兰盖尔语苗语英语荷兰语菲律宾语萨摩亚语葡萄牙语蒙古语西班牙语豪萨语越南语阿塞拜疆语阿姆哈拉语阿尔巴尼亚语阿拉伯语韩语马其顿语马尔加什语马拉地语马拉雅拉姆语马来语马耳他语高棉语齐切瓦语

 

 

 

 

 

 

 

 

 

文本转语音功能仅限200个字符

 

 

 

选项 : 历史 : 反馈 : Donate关闭
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值