输出单层结点

题目描述

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

给定二叉树的根结点指针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==0||dep<=0)
            return 0;
        ListNode* nodehead = new ListNode(-1);
        ListNode* node = nodehead;
        queue<TreeNode*> q;
        q.push(root);
//层次遍历的基础上,添加判断是否属于第dep层。
        int line1=1,line2=0,num=1;
        while(!q.empty()){
            if(dep == num){
                for(int i=0;i<line1;i++){
                ListNode* tmp = new ListNode(q.front()->val);
                node->next = tmp;
                node = tmp;
                q.pop();
                }
                return nodehead->next;
            }
            TreeNode * root1 = q.front();
            q.pop();
            if(root1->left != nullptr){
                q.push(root1->left);
                line2++;
            }
              if(root1->right != nullptr){
                q.push(root1->right);
                line2++;
            }
            if(--line1==0){
                line1=line2;
                line2=0;
                num++;
            }
        }
        return nodehead->next;
    }
};

line1表示出队那一层留下的元素个数,line2表示下一层入队元素的个数。num表示遍历的层数。

时间: 2024-08-08 21:59:51

输出单层结点的相关文章

c语言:建立简单的静态链表,它由3个学生数据的结点组成,要求输出各结点的数据

建立简单的静态链表,它由3个学生数据的结点组成,要求输出各结点的数据. 解:将第1个结点的起始地址赋给头指针head,将第2个结点的起始地址赋给第1个结点的next成员,将第3个结点的起始地址赋给第2个结点的next成员.第3个结点的next成员赋予NULL,这就形成了链表.为了建立链表,使head指向a结点,a.next指向b结点,b.next指向c结点,c.next=NULL的作用是使c.next不指向任何有用的存储单元. 程序: #include<stdio.h> struct Stud

6-11 先序输出叶结点

6-11 先序输出叶结点(15 分) 本题要求按照先序遍历的顺序输出给定二叉树的叶结点. 函数接口定义: void PreorderPrintLeaves( BinTree BT ); 其中BinTree结构定义如下: typedef struct TNode *Position; typedef Position BinTree; struct TNode{ ElementType Data; BinTree Left; BinTree Right; }; 函数PreorderPrintLea

PTA 中序输出叶子结点

6-8 中序输出叶子结点 (10 分) 本题要求实现一个函数,按照中序遍历的顺序输出给定二叉树的叶结点. 函数接口定义: void InorderPrintLeaves( BiTree T); T是二叉树树根指针,InorderPrintLeaves按照中序遍历的顺序输出给定二叉树T的叶结点,格式为一个空格跟着一个字符. 其中BiTree结构定义如下: typedef struct BiTNode { ElemType data; struct BiTNode *lchild,*rchild;

剑指offer系列13---反转链表并输出头结点

[题目]输入一个链表,反转链表后,输出链表的所有元素. [思路]将当前指针指向前者即为反转,反转是同时反转指针和赋值操作.即将指针指向前者并给前者赋值.反转后的头结点就是原链表的尾 结点.代码如下: 1 package com.exe3.offer; 2 /** 3 * 13[题目]输入一个链表,反转链表后,输出链表的所有元素. 4 * @author WGS 5 * 6 */ 7 public class ReverseLinkList { 8 public static class Link

从头到尾反向输出带头结点的单链表的每个节点的值

#include <stdio.h> #include <stdlib.h> #include <malloc.h> typedef struct LinkList { int data; struct LinkList *next; }NODE; NODE* Create_List() { int n; NODE *p,*r,*L=(NODE*)malloc(sizeof(NODE*)); L->data=0; L->next=NULL; r=L; sca

反转一个链表并输出各个结点的值

1 typedef struct Link 2 { 3 int data; 4 struct Link* next; 5 }NODE,*pNODE; 1 void reverse(pNODE *pphead) 2 { 3 pNODE pcur = *pphead, ppre = NULL, ptemp; 4 while(pcur != NULL) 5 { 6 ptemp = pcur->next; 7 pcur->next = ppre; 8 ppre = pcur; 9 pcur = pte

程序员面试金典算法题

空格替换 题目描述 请编写一个方法,将字符串中的空格全部替换为"%20".假定该字符串有足够的空间存放新增的字符,并且知道字符串的真实长度(小于等于1000),同时保证字符串由大小写的英文字母组成. 给定一个string iniString 为原始的串,以及串的长度 int len, 返回替换后的string. 测试样例: "Mr John Smith",13 返回:"Mr%20John%20Smith" "Hello World&qu

递归输出二叉树的每个结点

算法导论:10.4-2 给定一个二叉树,写出一个 O(n) 时间的递归过程,将该树每个结点的关键字输出. #ifndef _BINARY_TREE_H_ #define _BINARY_TREE_H_ /***************************************************** 算法导论:10.4-2 一个二叉树,使用递归输出每个结点 ******************************************************/ #include

010给定一个循环链表,实现一个算法返回这个环的开始结点 (keep it up)

给定一个循环链表,实现一个算法返回这个环的开始结点. 定义: 循环链表:链表中一个结点的指针指向先前已经出现的结点,导致链表中出现环. 例子: 输入:A -> B -> C -> D -> E -> C [结点C在之前已经出现过] 输出:结点C 可以用一个map<node*,bool> 就解决问题了. 下面是编程之美上一种奇特的解法:快慢指针解法. 代码: struct SNode { int data; SNode* next; }; SNode* findCi