您的位置:首页 > 职场人生

《程序员面试金典》输出单层结点

2015-09-16 18:55 423 查看



【 声明:版权所有,转载请标明出处,请勿用于商业用途。 联系信箱:libin493073668@sina.com】





题目链接:http://www.nowcoder.com/practice/cb6c883b123b44399377d0c71e6ba3ea?rp=1&ru=/ta/cracking-the-coding-interview&qru=/ta/cracking-the-coding-interview/question-ranking

题目描述

对于一棵二叉树,请设计一个算法,创建含有某一深度上所有结点的链表。

给定二叉树的根结点指针TreeNode* root,以及链表上结点的深度,请返回一个链表ListNode,代表该深度上所有结点的值,请按树上从左往右的顺序链接,保证深度不超过树的高度,树上结点的值为非负整数且不超过100000。

思路

如果之前做过类似的题目,那这道题其实也很简单了,遍历方法无非就是深度优先与广度优先,对于这道题深度优先肯定是不行的,我们知道广度优先是发散性的行走,所以我们可以使用广度优先来完成这道题,将所有同层的结点保存在队列之中。

/*
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) {}
};*/
class TreeLevel
{
	public:
		ListNode* getTreeLevel(TreeNode* root, int dep)
		{
			// write code here
			if(root==nullptr)
				return nullptr;
			queue<TreeNode*> Q,tmp;
			Q.push(root);
			int cnt = 1;
			ListNode *newList = new ListNode(0);
			ListNode *pNode = newList;
			while(!Q.empty())
			{
				if(cnt==dep)
				{
					while(!Q.empty())
					{
						ListNode *newNode = new ListNode(Q.front()->val);
						Q.pop();
						pNode->next = newNode;
						pNode = pNode->next;
					}
				}
				while(!Q.empty())
				{
					TreeNode *cur = Q.front();
					Q.pop();
					tmp.push(cur->left);
					tmp.push(cur->right);
				}
				while(!tmp.empty())
				{
					Q.push(tmp.front());
					tmp.pop();
				}
				++cnt;
			}
			return newList->next;

		}
};


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: