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),以菜单方式设计并完成功能任务:建立并存储树.输出前序遍历结果.输出中序遍历结果.输出后序遍历结果.交换左右子树.统计高度,其中对于 ...
随机推荐
- EntityFrame CodeFirst 自动生成表
来源:http://msdn.microsoft.com/zh-cn/data/jj193542 本视频和分步演练介绍通过 Code First 开发建立新数据库.这个方案包括建立不存在的数据库(Co ...
- 【BZOJ】3505: [Cqoi2014]数三角形
题意 \(n * m(1 \le n, m \le 1000)\)的网格,求顶点在格点上三角形的个数. 分析 假设\(n \le m\) \(ans = \binom{(n+1) * (m+1)}{3 ...
- python之 rabbitmq
一.发布hello world 首先我们看一个最简单的消息队列系统 #!/usr/bin/env python3 # -*- coding: utf-8 -*- """ ...
- java并发编程(十)使用wait/notify/notifyAll实现线程间通信
转载请注明出处:http://blog.csdn.net/ns_code/article/details/17225469 wait()方法:public final void wait() thr ...
- PHP入门介绍与环境配置
浏览目录: 一.PHP的背景和优势: 二.PHP原理简介: 三.PHP运行环境配置: 四.编写简单的PHP代码以及测试. 一.PHP的背景和优势 1.1 什么是PHP? PHP是能让你生成动态网页 ...
- NGUI实现技能CD效果
在NGUI中使用Sprite的遮罩效果可以很轻松的实现技能CD效果. 具体实现步骤: ①新建一个技能图标的Sprite 如图中的Skill001,再在该技能Sprite上添加一个Sprite做遮罩, ...
- 中國區的代理協議的韓國遊戲廠商PatiGames
“與阿裏巴巴簽署旗下游戲「突突三國」在中國區的代理協議的韓國遊戲廠商PatiGames決定與阿裏巴巴終止合作.”相信這條前不久報導的新聞,很多人並不陌生,但這背後其實並不像表面那樣簡單.早在今年4月P ...
- Android四大组件--ContentProvider详解(转)
一.相关ContentProvider概念解析: 1.ContentProvider简介在Android官方指出的Android的数据存储方式总共有五种,分别是:Shared Preferences. ...
- EMF学习,为了实现可扩展可自定义的模型验证 - emf quary 与 OCL
http://blog.csdn.net/javaman_chen/article/details/6020050 //这里的验证强调的是condition的构造,基于查找来判断验证结果.支持OCL也 ...
- MongoDB数据库的操作,增删改查
在student集合中插入一些数据 db.student.insert({ "学号":10010, "姓名":"德莱文", "年龄 ...