题目描述

从上往下打印出二叉树的每个节点,同层节点从左至右打印。

一 . 题目解析

了解过二叉树就应该知道,二叉树存在三种遍历方法:前序遍历(根→左→右)、中序遍历(左→根→右)、后续遍历(左→右→根)。

自定义二叉树:

    /// <summary>
/// 二叉树的节点定义
/// </summary>
/// <typeparam name="T">数据具体类型</typeparam>
public class Node<T>
{
public T data { get; set; } public Node<T> lchild { get; set; } public Node<T> rchild { get; set; } public Node()
{
} public Node(T data)
{
this.data = data;
} public Node(T data, Node<T> lchild, Node<T> rchild)
{
this.data = data;
this.lchild = lchild;
this.rchild = rchild;
}
}

看一下三种遍历的代码实现:这里涉及到双递归的方法。

       //该方法为递归遍历,仅阐述一下方法,目的在于搞清楚他们之间的逻辑关系。
// 前序遍历
public void PreOrder(Node<T> node)
{
//根节点开始,不为空的话,执行下面代码。
if (node != null)
{
// 前序方向根->左->右
//输出跟节点,往下走。
Console.Write(node.data + " ");
//当左节点不为空,返回递归。左节点为空,往下走
PreOrder(node.lchild);
//当左节点为空,输入右节点递归。
PreOrder(node.rchild);
}
} // 中序遍历
public void MidOrder(Node<T> node)
{
if (node != null)
{
// 中序遍历方向,左->根->右
// 输入跟节点,左节点不为空,一直往下走,当左节点为空,输出最下面的左节点
MidOrder(node.lchild);
//输出
Console.Write(node.data + " ");
// 当每次输出一个左节点,如果他有右节点,递归右节点
MidOrder(node.rchild);
}
} // 后序遍历
public void PostOrder(Node<T> node)
{
if (node != null)
{
//后序遍历,左->右->根
//一直递归左节点不输出,直到最下面的左右节点都市空的,才输出
PostOrder(node.lchild);
PostOrder(node.rchild);
//输出
Console.Write(node.data + " ");
}
}

解释一下双递归:(遇到双递归问题时,当第一个递归执行的时候,第二个递归并不是不执行,而是先进栈,根据顺序来,简单明了的解释就是,第一个递归你该怎么走就怎么走,完全没什么可以阻挡你,第二个递归就不同了,他是在第一个递归的基础上执行的,但不是立刻执行,而是执行递归进栈,当第一个递归完全执行技术的时候,第二个递归出栈,开始慢慢执行!)

具体解释:

如上图所示,二叉树的基本遍历方法中并不存在题目要求的方法,因此,必须自定义一种方法实现要求。

经过思考,得出如下步骤:

(1)定义两个链表,一个作为寄存链表,一个用作与最后输出的链表。

(2)若根节点不为空,把根节点存在寄存链表里。

(3)接下来,把他放到最后输出的链表里,之后呢,如果这个节点还有左右子节点的话,把左右子节点依次存在寄存链表里面。

(4)执行(3)循环,当循环执行次数大于或者等于寄存链表的长度时,停止执行(因为每执行一次循环,就相当于把寄存链表里的数字存到输出链表里,当全搞定,自然停止。)

二 . 代码实现

using System.Collections.Generic;
/*
public class TreeNode
{
public int val;
public TreeNode left;
public TreeNode right;
public TreeNode (int x)
{
val = x;
}
}*/ class Solution
{
public List<int> PrintFromTopToBottom(TreeNode root)
{
// write code here
//定义输出链表List1和寄存链表List2
List<int> List1 = new List<int>();
List<TreeNode> List2 = new List<TreeNode>();
int i = ;
//根节点的添加方法
if (root != null)
{
List2.Add(root);
}
//(3)循环
while (i < List2.Count)
{
//定义一个节点Node1等于寄存链表中的第i个数
TreeNode Node1 = List2[i];
//给输出链表添加数据
List1.Add(Node1.val);
//左右子节点排队进入链表List2
if (Node1.left != null)
{
List2.Add(Node1.left);
}
if (Node1.right != null)
{
List2.Add(Node1.right);
}
//i的执行次数应等于二叉树节点数
i++;
}
return List1;
}
}

剑指Offer的学习笔记(C#篇)-- 从上往下打印二叉树的更多相关文章

  1. (剑指Offer)面试题23:从上到下打印二叉树

    题目: 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 思路: 很明显,这是一个广度优先遍历. 需要一个队列容器来保存结点,具体操作: 1.将根结点压入队列中,并打印根结点:如果根结点有子结点 ...

  2. 【剑指offer】面试题23:从上往下打印二叉树

    题目: 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 思路: bfs,队列. 注意,队列最后不要忘了pop(). 代码: /* struct TreeNode { int val; stru ...

  3. 《剑指offer》— JavaScript(22)从上往下打印二叉树

    从上往下打印二叉树 题目描述 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 思路 借助两个辅助队列,一个用来存放结点,一个用来存放结点值: 先将根节点加入到队列中,然后遍历队列中的元素,遍历 ...

  4. 【剑指Offer】面试题32 - III. 从上到下打印二叉树 III

    题目 请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推. 例如: 给定二叉树: [3,9,20,nu ...

  5. 【剑指Offer】面试题32 - II. 从上到下打印二叉树 II

    题目 从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行. 例如: 给定二叉树: [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7 返回 ...

  6. 【剑指Offer】面试题32 - I. 从上到下打印二叉树

    题目 从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印. 例如: 给定二叉树: [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7 返回: [3 ...

  7. 《剑指offer》面试题32 - I. 从上到下打印二叉树

    问题描述 从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印.   例如: 给定二叉树: [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7 返回 ...

  8. 《剑指offer》面试题32 - II. 从上到下打印二叉树 II

    问题描述 从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行. 例如: 给定二叉树: [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7 ...

  9. 《剑指offer》面试题32 - III. 从上到下打印二叉树 III

    问题描述 请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推. 例如: 给定二叉树: [3,9,20, ...

  10. 剑指Offer的学习笔记(C#篇)-- 序列化二叉树

    题目描述 请实现两个函数,分别用来序列化和反序列化二叉树 一 . 理解题意 二叉树的序列化,是将一个结构化的东西变成扁平化的字符串,序列化二叉树或者是反序列化二叉树就是二叉树和扩展二叉树遍历序列之间的 ...

随机推荐

  1. Vue-router进阶、单页面应用(SPA)带来的问题

    一 . vue-router 进阶 回顾学过的vue-router,并参考官方文档学习嵌套路由等路由相关知识. 二 . 单页面应用(SPA)带来的问题 1 . 虽然单页面应用有优点 , 但是,如果后端 ...

  2. vscode 中 eslint 的配置

    上个博客说到了如何配置 eslint 和 editorconfig, 但是每次运行项目的时候才能知道哪段代码不符合规范,确实也有点蛋疼. 那么能不能直接在编辑器中就能看到不符合规范的代码的呢??? 这 ...

  3. 0-mybatis目录

    mybatis 第一天: 对原生态jdbc程序(单独使用jdbc开发)问题总结 框架原理 入门程序 用户的增.删.改.查 开发dao两种方法: 原始dao开发方法(程序需要编写dao接口和dao实现类 ...

  4. PYTHON 爬虫笔记七:Selenium库基础用法

    知识点一:Selenium库详解及其基本使用 什么是Selenium selenium 是一套完整的web应用程序测试系统,包含了测试的录制(selenium IDE),编写及运行(Selenium ...

  5. CSS3悬停特效合集Hover.css

    CSS3悬停特效合集Hover.css是一款特效丰富,支持2D变化特效.边框特效.阴影特效等: 使用简单,可直接复制相关特效代码,快速应用到元素上. 源码地址:http://www.huiyi8.co ...

  6. c# 实现WebSocket

    用C# ASP.NET MVC 实现WebSocket ,对于WebSocket想必都很了解了,不多说. 东西做的很粗糙 只能实现基本的聊天功能,不过基本的通信实现了,那么后序的扩展应该也不难(个人这 ...

  7. linux 多线程编程-读写者问题

    #include <cstdio> #include <pthread.h> #include <unistd.h> ]; int i,j; pthread_rwl ...

  8. HihoCoder1654: XY游戏([Offer收割]编程练习赛39)(好久没写搜索)(已经超级简短了)

    描述 如下图所示,在4x4的棋盘上有X和Y两种棋子各若干枚:O表示空格. OXXY YOOX XOOY XOXX 小Hi每次可以选择任意一枚棋子,将它移动到上下左右相邻的空格中. 小Hi想知道最少移动 ...

  9. BZOJ_1119_[POI2009]SLO_置换+贪心

    BZOJ_1119_[POI2009]SLO_置换+贪心 Description 对于一个1-N的排列(ai),每次你可以交换两个数ax与ay(x<>y),代价为W(ax)+W(ay) 若 ...

  10. 「LOJ#10068」「一本通 3.1 练习 3」秘密的牛奶运输(次小生成树

    题目描述 Farmer John 要把他的牛奶运输到各个销售点.运输过程中,可以先把牛奶运输到一些销售点,再由这些销售点分别运输到其他销售点. 运输的总距离越小,运输的成本也就越低.低成本的运输是 F ...