输出树的单层节点

理解题意,注意链表创建和树的层次遍历。

/*****************************************************
* \file TreeLevel.cpp
* \date 2016/05/31 17:05

* \问题描述:
对于一棵二叉树,请设计一个算法,创建含有某一深度上所有结点的链表。
给定二叉树的根结点指针TreeNode* root,以及链表上结点的深度,请返回一个链表ListNode,代表该深度上所有结点的值,请按树上从左往右的顺序链接,
保证深度不超过树的高度,树上结点的值为非负整数且不超过100000。

* \问题分析:
<方法1>:层次遍历
这个题目的意思就是输出二叉树的某一层的所有元素,这个首先想到的是层次遍历,层次遍历最简单的方法就是用队列实现,我们传统的层次遍历方法是可以输出所有元素,那么如何区分相邻两层之间的元素呢?
其实我们可以用两个整数变量line1,line2来记录相邻两层的元素个数,其中line1代表出栈那一层留下的元素个数,line2代表下一层进栈元素的个数,
每当line1为0的时候,说明上一层已经全部出栈,下一层已经全部入栈,那么层次遍历层数就加一,这个时候将line2的值复制给line1,line2=0,
当遍历到第dep层的时候,便把那一层的所有元素输出,停止遍历。

//还有就是用两个队列实现,一个存放当前层的结点,一个存下一层的结点;或者一个队列一个vector存放当前行的所有节点,每一层更新vector
*****************************************************/

struct TreeNode
{
    int val;
    TreeNode* left;
    TreeNode* right;
    TreeNode(int x) :val(x), left(nullptr), right(nullptr){}
};
struct ListNode
{
    int val;
    ListNode* next;
    ListNode(int x) :val(x), next(nullptr){}
}; 

using namespace std;
#include <queue>
class TreeLevel{
public:
    ListNode* getTreeLevel(TreeNode* root,int dep){
    if (root==nullptr||dep<=0)
    {
        return nullptr;
    }
    ListNode* pHead = new ListNode(-1);
    ListNode* pNode = pHead;
    queue<TreeNode*> qu;
    qu.push(root);
    int lineCur = 1, lineNext = 0, num = 1;
    while (!qu.empty())
    {
        if (num==dep)
        {
            for (int i = 0; i < lineCur;i++)
            {
                TreeNode* node = qu.front();
                pNode->next = new ListNode(node->val);
                pNode = pNode->next;
                qu.pop();
            }
            return pHead->next;
        }
        TreeNode* node = qu.front();
        if (node->left)
        {
            qu.push(node->left);
            lineNext++;
        }
        if (node->right)
        {
            qu.push(node->right);
            lineNext++;
        }
        qu.pop();
        if (--lineCur==0)
        {
            lineCur = lineNext;
            lineNext = 0;
            num++;
        }
    }
    return pHead->next;
    }
};
时间: 2024-12-14 22:22:23

输出树的单层节点的相关文章

LeetCode:Path Sum - 树的根节点到叶节点的数字之和

1.题目名称 Path Sum(树的根节点到叶节点的数字之和) 2.题目地址 https://leetcode.com/problems/path-sum/ 3.题目内容 英文:Given a binary tree and a sum, determine if the tree has a root-to-leaf path such that adding up all the values along the path equals the given sum. 中文:给定一颗二叉树,如

lua 如何输出树状结构的table?

为了让游戏前端数据输出更加条理,做了一个简单树状结构来打印数据. ccmlog.lua local function __tostring(value, indent, vmap) local str = '' indent = indent or '' vmap = vmap or {} --递归结束条件 if (type(value) ~= 'table') then if (type(value) == 'string') then --字符串 str = string.format("[

关于树的父子节点的图形化展示

功能需求是实现树的父子节点的图形展示关系,且可以点击节点的时候,会相应地切换显示.因此网上寻找相关的插件来看看是不是满足需求.参考了许多的博客,感觉最有价值的就是这篇博客http://www.cnblogs.com/liuyungao/p/5624163.html,但是我最终也没有选择里面说的插件,最后用了OrgChart,软件的github地址:https://github.com/dabeng/OrgChart. 之前找的那篇博客,自己也稍微研究了一下,但是没有深入,发现有的是不能很契合我的

树的父节点表示法及Java实现

类和模块 类的实现是基于继承机制的,如果两个类继承同一个原型对象,那么也就是说,也就意味着使用同一个构造函数来实例化,它们是同一个类的实例. 9.1类和原型 在javascript中,类的实例都是从同一个原型对象上继承属性,所以原型对象是类的核心. 9.2类和构造函数 构造函数是初始化新创建对象的函数. 构造函数的prototype属性被用作新对象的原型,因此,同一个构造函数的实例化的对象都继承自同一个对象. 9.3javasript中的java式的类继承 实例字段 实例方法 类字段 类方法 9

设计一个算法,输出从每个叶子节点到根节点的逆路径

下面使用三种遍历方法输出逆路径,假设二叉树采用二叉链存储结构存储. 方法1:采用基于层次遍历的方法,设计的队列为非环形顺序队列,将所有已扫描的节点指针进队,并在队列中保存双亲节点的位置.当找到一个叶子节点时,在队列中通过双亲节点的位置输出该叶子节点到根节点的逆路径.对应的算法如下: void AllPath(BTNode * b) { struct snode { BTNode *node; //存放当前节点指针 int parent; //存放双亲节点在队列中的位置 } Qu[MaxSize]

hdu6035 Colorful Tree 树形dp 给定一棵树,每个节点有一个颜色值。定义每条路径的值为经过的节点的不同颜色数。求所有路径的值和。

/** 题目:hdu6035 Colorful Tree 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6035 题意:给定一棵树,每个节点有一个颜色值.定义每条路径的值为经过的节点的不同颜色数.求所有路径的值和. 思路:看题解后,才想出来的.树形dp. 求所有路径的值和 = 路径条数*总颜色数(n*(n-1)*colors/2)-sigma(每种颜色没有经过的路径条数) 主要是求每种颜色没有经过的路径条数. 画一棵树,我直接用颜色值表示节点编号. 2

计蒜客模拟赛D1T2 蒜头君的树:树上节点之间最短距离和

题目链接:https://nanti.jisuanke.com/t/16446 题意: 给你一棵有n个节点的树以及每条边的长度,输出树上节点之间的最短距离和.然后进行m次操作,每次操作更改一条边的长度,分别输出每次操作后树上节点之间的最短距离和. 题解: 最短距离和 = ∑(树上每一条边被最短路经过的次数 * 这条边的长度) 一个节点到它父节点的边被经过的次数 = 该节点以及它的子孙的节点个数 * 除了该节点和它子孙之外的所有节点总个数 每一个节点以及它子孙节点的个数总和用一遍dfs保存在num

java 递归在实例中的几种用途(ps:准确获取树的子节点)

  递归做为一种算法在程序设计语言中广泛应用. 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量.递归的能力在于用有限的语句来定义对象的无限集合.一般来说,递归需要有边界条件.递归前进段和递归返回段.当边界条件不满足时,递归前进:当边界条件满足时,递归返回(递归简单说就是程序调用自身的编程技巧,前面说这么多废话只是为了显得

lua 怎样输出树状结构的table?

为了让游戏前端数据输出更加条理,做了一个简单树状结构来打印数据. ccmlog.lua local function __tostring(value, indent, vmap) local str = '' indent = indent or '' vmap = vmap or {} --递归结束条件 if (type(value) ~= 'table') then if (type(value) == 'string') then --字符串 str = string.format("[