《程序员面试金典》--输出二叉树中某一层的所有元素
2015-10-23 16:23
676 查看
题目描述:
对于以上给定的一棵二叉树TreeNode,请设计一个算法,创建含有某一深度上所有结点的链表。给定二叉树的根结点指针TreeNode* root,以及链表上结点的深度,请返回一个链表ListNode,代表该深度上所有结点的值,请按树上从左往右的顺序链接,保证深度不超过树的高度,树上结点的值为非负整数且不超过100000。
题目分析:
<方法1>:层次遍历
这个题目的意思就是输出二叉树的某一层的所有元素,这个首先想到的是层次遍历,层次遍历最简单的方法就是用队列实现,我们传统的层次遍历方法是可以输出所有元素,那么如何区分相邻两层之间的元素呢?
其实我们可以用两个整数变量line1,line2来记录相邻两层的元素个数,其中line1代表出栈那一层留下的元素个数,line2代表下一层进栈元素的个数,每当line1为0的时候,说明上一层已经全部出栈,下一层已经全部入栈,那么层次遍历层数就加一,这个时候将line2的值复制给line1,line2=0,当遍历到第dep层的时候,便把那一层的所有元素输出,停止遍历。
代码实现如下:
其实也可以用递归遍历实现,刚开始为深度为dep,每往下递归一层,则深度减一(dep=dep-1),当dep==1的时候,便输出那个元素,如果先递归左子树,那么则实现从左到右打印,如果先递归右子树,则实现从右往左打印。
程序代码如下:
<span style="font-size:18px;">struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { } }; struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) {} };</span>
对于以上给定的一棵二叉树TreeNode,请设计一个算法,创建含有某一深度上所有结点的链表。给定二叉树的根结点指针TreeNode* root,以及链表上结点的深度,请返回一个链表ListNode,代表该深度上所有结点的值,请按树上从左往右的顺序链接,保证深度不超过树的高度,树上结点的值为非负整数且不超过100000。
题目分析:
<方法1>:层次遍历
这个题目的意思就是输出二叉树的某一层的所有元素,这个首先想到的是层次遍历,层次遍历最简单的方法就是用队列实现,我们传统的层次遍历方法是可以输出所有元素,那么如何区分相邻两层之间的元素呢?
其实我们可以用两个整数变量line1,line2来记录相邻两层的元素个数,其中line1代表出栈那一层留下的元素个数,line2代表下一层进栈元素的个数,每当line1为0的时候,说明上一层已经全部出栈,下一层已经全部入栈,那么层次遍历层数就加一,这个时候将line2的值复制给line1,line2=0,当遍历到第dep层的时候,便把那一层的所有元素输出,停止遍历。
代码实现如下:
class TreeLevel { public: ListNode* getTreeLevel(TreeNode* root, int dep) { // write code here if(dep<=0||root==NULL) return NULL; ListNode* list=new ListNode(-1); ListNode* listHead=list; queue<TreeNode*> qu; qu.push(root); int lines1=1,lines2=0,num=1; while(!qu.empty()) { if(num==dep) { for(int i=0;i<lines1;i++) { TreeNode* root1=qu.front(); list->next=new ListNode(root1->val); list=list->next; qu.pop(); } return listHead->next; } TreeNode* root1=qu.front(); if(root1->left) { qu.push(root1->left); lines2++; } if(root1->right) { qu.push(root1->right); lines2++; } qu.pop(); if(--lines1==0) { lines1=lines2; lines2=0; num++; } } return listHead->next; }
}<方法2>:递归遍历
其实也可以用递归遍历实现,刚开始为深度为dep,每往下递归一层,则深度减一(dep=dep-1),当dep==1的时候,便输出那个元素,如果先递归左子树,那么则实现从左到右打印,如果先递归右子树,则实现从右往左打印。
程序代码如下:
class TreeLevel { public: ListNode* getTreeLevel(TreeNode* root, int dep) { // write code here ListNode* list=new ListNode(-1); ListNode* listHead=list; get1(root,list,dep); return listHead->next; } void get1(TreeNode* root,ListNode* &list,int dep) { if(dep<=0||root==NULL) return; if(dep==1) { ListNode* listnext=new ListNode(root->val); list->next=listnext; list=list->next; return ; } get1(root->left,list,dep-1); get1(root->right,list,dep-1); } };
相关文章推荐
- 【扣丁学堂】让程序员的开发项目不再半途而废
- java异常架构图 和几个面试题
- 阿里云程序员曝12306网站与阿里巴巴合作 采用其技术方案
- 面试题(一)
- Java面试问题集锦05-对象和类
- 二维卷积面试题
- 黑马程序员——反射Constructor类
- 11年之后再聊程序员的人生
- 黑马程序员——反射的基石 class类
- 机器学习&数据挖掘笔记_16(常见面试之机器学习算法思想简单梳理)
- 菜鸟之路-Volume、Brightness调节
- 一位入行20年的老程序员对新人的建议
- 【程序员眼中的统计学(8)】统计抽样的运用:抽取样本
- 程序员常去的6个头条分享站点
- 2015年百度三面试题
- 设计类职业
- 程序员生意经
- 2015年百度二面试题
- 高级程序员不写代码?
- 2015年百度一面试题