C#先序遍历2叉树(非递归)
找了下先序遍历二叉树C# 实现貌似没有 顺手些了一个
大致思路是:
传入根节点,然后依次循环其子节点推入到栈中,
当推入的节点没有子节点的时候(叶子)或者所有子节点均已经遍历过后(上一次遍历的节点是该节点的右子节点),再依次退出栈。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace ConsoleApplication5
{
class Program
{
static void Main(string[] args)
{
Node treeRoot = CreateTree();
scanTree(treeRoot);
} private static void scanTree(Node treeRoot)
{
List<Node> list = new List<Node>();
list.Add(treeRoot);
Node point = treeRoot;
Write(treeRoot);
while (true)
{
if (!list.Contains(point))
{ //上一轮是移除的操作
if (treeRoot.leftSon == point)
{//移除的是左结点
if (treeRoot.rightSon != null)
{
treeRoot = treeRoot.rightSon;
list.Add(treeRoot);
Write(treeRoot);
point = treeRoot;
continue;
}
list.Remove(treeRoot);
if (list.Count == )
{
break;
}
point = treeRoot;
treeRoot = list[list.Count - ];
}
else
{//移除的是右结点
list.Remove(treeRoot);
if (list.Count == )
{
break;
}
point = treeRoot;
treeRoot = list[list.Count - ];
}
continue;
} if (treeRoot.leftSon != null)
{
treeRoot = treeRoot.leftSon;
Write(treeRoot);
list.Add(treeRoot);
point = treeRoot;
continue;
}
if (treeRoot.rightSon != null)
{
treeRoot = treeRoot.rightSon;
Write(treeRoot);
point = treeRoot;
list.Add(treeRoot);
continue;
}
//当前的节点是叶子节点 if (treeRoot.leftSon == null && treeRoot.rightSon == null)
//{
list.Remove(treeRoot);
if (list.Count == )
{
break;
}
point = treeRoot;
treeRoot = list[list.Count - ];
// }
} } public static void Write(Node node)
{
Console.WriteLine(node.Data);
} private static Node CreateTree()
{
Node a = new Node("A");
a.leftSon = new Node("B");
a.rightSon = new Node("C"); a.leftSon.leftSon = new Node("D");
a.leftSon.rightSon = new Node("E"); a.rightSon.leftSon = new Node("F");
a.rightSon.rightSon = new Node("G"); a.leftSon.leftSon.leftSon = new Node("H");
a.leftSon.leftSon.rightSon = new Node("I");
return a;
}
} class Node
{
public string Data { get; set; }
public Node leftSon { get; set; }
public Node rightSon { get; set; } public Node(string data)
{
Data = data;
}
}
}
C#先序遍历2叉树(非递归)的更多相关文章
- 图的深度优先遍历(DFS) c++ 非递归实现
深搜算法对于程序员来讲是必会的基础,不仅要会,更要熟练.ACM竞赛中,深搜也牢牢占据着很重要的一部分.本文用显式栈(非递归)实现了图的深度优先遍历,希望大家可以相互学习. 栈实现的基本思路是将一个节点 ...
- [转载]Morris Traversal方法遍历二叉树(非递归,不用栈,O(1)空间)
本文主要解决一个问题,如何实现二叉树的前中后序遍历,有两个要求: 1. O(1)空间复杂度,即只能使用常数空间: 2. 二叉树的形状不能被破坏(中间过程允许改变其形状). 通常,实现二叉树的前序(pr ...
- Morris Traversal方法遍历二叉树(非递归,不用栈,O(1)空间)——无非是在传统遍历过程中修改叶子结点加入后继结点信息(传统是stack记录),然后再删除恢复
先看看线索二叉树 n个结点的二叉链表中含有n+1(2n-(n-1)=n+1)个空指针域.利用二叉链表中的空指针域,存放指向结点在某种遍历次序下的前驱和后继结点的指针(这种附加的指针称为"线索 ...
- [LeetCode]105. 从前序与中序遍历序列构造二叉树(递归)、108. 将有序数组转换为二叉搜索树(递归、二分)
题目 05. 从前序与中序遍历序列构造二叉树 根据一棵树的前序遍历与中序遍历构造二叉树. 注意: 你可以假设树中没有重复的元素. 题解 使用HashMap记录当前子树根节点在中序遍历中的位置,方便每次 ...
- LeetCode 145. 二叉树的后序遍历 (用栈实现后序遍历二叉树的非递归算法)
题目链接:https://leetcode-cn.com/problems/binary-tree-postorder-traversal/ 给定一个二叉树,返回它的 后序 遍历. 示例: 输入: [ ...
- C# 遍历文件夹非递归实现(采用队列的广度优先算法)(转)
一.实现思路: 1. 创建一个队列(使用C# 队列类 Queue,需要使用命名空间 System.Collections.Generic): 2. 把起始文件夹名称排入队中: 3. 检查队列中是否有文 ...
- Morris Traversal 方法遍历二叉树(非递归、不用栈,O(1)空间)
http://www.cnblogs.com/AnnieKim/archive/2013/06/15/MorrisTraversal.html
- 左神算法基础班4_1&2实现二叉树的先序、中序、后序遍历,包括递归方式和非递归
Problem: 实现二叉树的先序.中序.后序遍历,包括递归方式和非递归方式 Solution: 切记递归规则: 先遍历根节点,然后是左孩子,右孩子, 根据不同的打印位置来确定中序.前序.后续遍历. ...
- 二叉树的创建、遍历(递归和非递归实现)、交换左右子数、求高度(c++实现)
要求:以左右孩子表示法实现链式方式存储的二叉树(lson—rson),以菜单方式设计并完成功能任务:建立并存储树.输出前序遍历结果.输出中序遍历结果.输出后序遍历结果.交换左右子树.统计高度,其中对于 ...
随机推荐
- So many many foods here!
水果类(fruits):西红柿 tomato 菠萝 pineapple 西瓜watermelon 香蕉banana 柚子 shaddock (pomelo) 橙子orange 苹果apple 柠檬le ...
- js入门篇之正则表达式基础
定义:正则用于规定在文本中检索的内容,它是对字符串执行模式匹配的强大工具 RegExp(正则表达式) 对象的语法: new RegExp(pattern, attributes); pattern为一 ...
- JDBC编程
简单地说,JDBC 可做三件事:与数据库建立连接.发送 SQL 语句并处理结果.下列代码段给出了以上三步的基本示例: Connection con = DriverManager.getConnect ...
- Android课程---添加黑名单的练习(课堂讲解)
DBHelper.java package com.hanqi.test3; import android.content.Context; import android.database.sqlit ...
- 如何给你的LinuxVPS装个远程桌面
有些人抱怨Linux的系统没有桌面,用着实在是不方便.今天整理一下网上的教程,给VPS装个桌面环境.Centos系统+X Window+GNOME Desktop. 此程序会安装无数乱七八糟的东西到你 ...
- MINIUI版本破解
miniui类似easyui是一个web ui,功能比不上人家还是收费,收费也就算了,代码还加密混淆,过期提示脚本越写越离谱,严重低估IT人员的智慧,对此表示强烈不满,故下载了几个版本花了一小时破解: ...
- 关于ios 3D变换 CGAffineTransformIdentity
每次做完3D变换以后,重新设置view的frame时,记得用CGAffineTransformIdentity 对3D变换进行还原,否则将会影响frame.当你对view进行3D变换后,重新设置vie ...
- 使用js实现点击按钮下载文件
有时候我们在网页上需要增加一个下载按钮,让用户能够点击后下载页面上的资料,那么怎样才能实现功能呢?这里有两种方法: 现在需要在页面上添加一个下载按钮,点击按钮下载文件. 题外话,这个下载图标是引用的 ...
- C++学习笔记 知识集锦(一)
1.内存管理的开销 2.函数调用框架 3.类为什么要定义在头文件 4.C++的组合 5.在类的外部定义成员函数 6.bool类型为什么可以当做int类型 7.无符号保留原则 8.C++类型检查 9.何 ...
- jQuery.ajax( options ) : 通过 HTTP 请求加载远程数据
jQuery.ajax( options ) : 通过 HTTP 请求加载远程数据 这个是jQuery 的底层 AJAX 实现.简单易用的高层实现见 $.get, $.post 等. $.ajax() ...