`
bbls
  • 浏览: 63269 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类

数据结构C#实现-二叉查找树的创建,查找,以及各种递归(非递归)遍历算法

阅读更多

关键字:
        二叉树,查找,(breadth-first algrithm) ---前序遍历,中序遍历,后序遍历,(depth-first algrithm)-层次遍历。
摘要:
        树是一种非常重要的数据结构,Binary Tree则是树型结构中应用最为广泛。本文给出了C#版本的二叉树的建立,查找,以及各种递归和非递归的遍历算法。

代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;

namespace DS
{
    
public class Tree
    
{
        
public Tree(int data)
        
{
            _data 
= data;
            leftChild 
= null;
            rightChild 
= null;
        }

        
private int _data;
        
private Tree leftChild;
        
private Tree rightChild;

     
       
        
public void PreOrder()
        
{
            
            
if(this != null)
            
{
                Console.Write(
"{0} ", _data);
                
if(leftChild!=null)
                  leftChild.PreOrder();
                
if(rightChild!=null)
                 rightChild.PreOrder();
            }

        }


        
public void InOrder()
        
{

            
if (this != null)
            
{
                
if (leftChild != null)
                    leftChild.InOrder();
                
                Console.Write(
"{0} ", _data);
                           
                
if (rightChild != null)
                    rightChild.InOrder();
            }

        }


        
public void PostOrder()
        
{
            
if (this != null)
            
{
                
if (leftChild != null)
                    leftChild.PostOrder();
                
if (rightChild != null)
                    rightChild.PostOrder();
                Console.Write(
"{0} ", _data);
            }

        }



        
public void PostOrderWithoutIretation()
        
{
            Stack
<Tree> stack = new Stack<Tree>();
            Tree pre
=null, temp;
            temp
=this;
            
while (temp != null || stack.Count != 0)
            
{
                
while (temp != null)
                
{
                    stack.Push(temp);
                    temp 
= temp.leftChild;
                }


                temp 
= stack.First<Tree>();
                
if (temp.rightChild == null || temp.rightChild==pre)
                
{                   
                    temp
=stack.Pop();
                    Console.Write(
"{0} ", temp._data);
                    pre 
= temp;
                    temp 
= null;
                }

                
else
                
{
                    temp 
= temp.rightChild;
                }


            }

           
        }

        
public void InOrderWithoutIretation()
        
{
            Stack
<Tree> stack = new Stack<Tree>();
            Tree  temp;
            temp 
= this;
           
while (temp!=null || stack.Count != 0)
            
{              
                
while (temp != null)
                
{
                    stack.Push(temp);
                    temp 
= temp.leftChild;                    
                }


                temp 
= stack.Pop();
                         
                Console.Write(
" {0} ", temp._data);
                temp 
= temp.rightChild;
            }

        }


        
public void LevelOrder()
        
{
            Queue
<Tree> queue = new Queue<Tree>();
            queue.Enqueue(
this);
            Tree  temp;
            
while (queue.Count != 0)
            
{
                temp
=queue.Dequeue();
                Console.Write(
"{0} ", temp._data);

                
if(temp.leftChild!=null)
                    queue.Enqueue(temp.leftChild);
                
if(temp.rightChild!=null)
                    queue.Enqueue(temp.rightChild);
               
            }


        }


        
public void Search(int data, out Tree p, out Tree q)
        
{
            p 
= this;
            q 
= null;
            
while (p != null)
            
{
                q 
= p;
                
if (p._data>data)
                    p 
= p.leftChild;
                
else if (p._data < data)
                    p 
= p.rightChild;
                
else
                    
break;
            }
               
        }



        
public bool InsertNode(int data)
        
{
            Tree newNode 
= new Tree(data);
            Tree p,q;
            Search(data, 
out p, out q);
            
if (p!= null)
                
return true;
            
else
            
{
                
if (q._data >data)
                    q.leftChild 
=newNode;
                
else
                    q.rightChild 
= newNode ;
            }

            
return false;
        }

        
public void PreOrderWithouIreration()
        
{
            Tree temp;
            temp 
= this;
            Stack
<Tree> stack=new Stack<Tree>();
            stack.Push(
this);
            
while (stack.Count != 0)
            
{
                temp 
= stack.Pop();
                Console.Write(
"{0} ", temp._data);
                
if (temp.rightChild!=null)
                    stack.Push(temp.rightChild);
                
if (temp.leftChild!=null)
                    stack.Push(temp.leftChild);
            }


        }

    }


   

    
class Program
    
{
        
static void Main(string[] args)
        
{
            Tree Root 
= new Tree(10);
        
          Root.InsertNode(
5);
           Root.InsertNode(
14);
           Root.InsertNode(
9);
           Root.InsertNode(
13);
           Root.InsertNode(
8);
            Console.WriteLine(
"pre order");
            Root.PreOrder();
            Console.WriteLine(
"pre order without iteration\n");
            Root.PreOrderWithouIreration();
            
            Console.WriteLine(
"\nIn order");
            Root.InOrder();
            Console.WriteLine(
"\nInOrder without Iteration");
            Root.InOrderWithoutIretation();

            Console.WriteLine(
"\nPost Order:");
            Root.PostOrder();
            Console.WriteLine(
"\nPost Order without Iteration");
            Root.PostOrderWithoutIretation();


            Console.WriteLine(
"\nlevel order");
            Root.LevelOrder();
            Console.Read();
          
        }

    }

}

分享到:
评论

相关推荐

    数据结构与算法(C#实现)系列

    - 文章中提到了多种数据结构,包括但不限于树、N叉树、广义树、二叉树、BST二叉查找树、AVL平衡树、堆、二叉堆以及图等。 - 这些数据结构通常涉及复杂的操作,如插入、删除、查找以及遍历等。 - 在C#中实现这些...

    陈广 C#数据结构视频 第7章 查找

    6. 线索二叉树:在二叉查找树的基础上增加线索,便于在非递归方式下进行遍历。 课程的SWF文件可能包含了这些概念的演示和实例代码,例如7-1.swf可能讲解了基本的查找概念,7-2.swf可能详细阐述了二分查找及其在C#中...

    数据结构与算法(C#实现)系列---二叉树.doc

    ### 数据结构与算法(C#实现)系列---二叉树 #### 概述 本文档将详细介绍二叉树这一重要的数据结构及其在C#中的实现。二叉树是一种非线性的数据结构,在计算机科学中有着广泛的应用,如在编译器、数据库系统、搜索...

    C#-使用C#实现的二叉树算法-算法实现.zip

    在C#编程语言中,二叉树是一种常用的数据结构,它由节点组成,每个节点包含两个子节点,通常称为左子节点和右子节点。二叉树算法在计算机科学领域有着广泛的应用,如搜索、排序、文件系统管理等。本项目提供了一套...

    数据结构与算法(C#实现)

    通过上述介绍可以看出,C#是一种非常强大的语言,不仅可以用来开发Web应用和桌面应用,还能有效地实现各种复杂的数据结构和算法。掌握这些基础知识不仅有助于提升个人技能,也能为解决实际问题提供有效的工具和支持...

    二叉搜索树(C#,C++)

    4. **非递归实现**:虽然递归方便,但可能会导致堆栈溢出。使用迭代方法,如使用栈来模拟递归过程,可以避免这个问题。 5. **平衡因子**:在极端情况下,二叉搜索树可能会退化成链表,导致性能下降。为了保持高效性...

    数据结构(C#语言版).

    - **定义**:树是一种非线性的数据结构,它由节点集合和边集合组成。 - **相关术语**:根节点、叶子节点、父节点、子节点等。 - **逻辑表示**:树可以用多种图形方式表示。 - **基本操作**:创建、遍历、搜索等。 #...

    数据结构C#篇(链表,二叉树,排序)

    ### 数据结构C#篇知识点概览 #### 一、数据结构与C#语言结合的意义 在当前快速发展的信息技术领域中,数据结构与算法是计算机科学的核心组成部分,它们为解决复杂问题提供了理论基础和技术手段。随着.NET平台的...

    C#数据结构与算法1 SWF格式

    树是一种非线性的数据结构,包括二叉树、平衡树(如AVL树、红黑树)等。二叉树每个节点最多有两个子节点,常用于搜索和排序操作。C#中的BinarySearchTree类可以实现二叉搜索树。平衡树则通过保持树的高度平衡,确保...

    C#(.net)中关于树的使用(添加删除等)

    总之,理解并掌握C#中树的使用,不仅有助于编写高效的数据结构算法,还能在各种应用场景中发挥重要作用,如文件系统、数据库索引、算法设计等。通过熟练运用上述知识点,开发者可以创建出强大且灵活的树形数据处理...

    C#数据结构实践项目源程序

    源代码可能会演示如何使用Push和Pop方法进行元素的入栈和出栈操作,以及如何实现递归算法的非递归版本。 4. **队列(Queue)**:队列是一种先进先出(FIFO)的数据结构,C#提供了Queue类。源代码可能会展示如何使用...

    数据结构与算法C实现).doc

    在C#中,我们可以自定义类来表示广义树节点,并实现深度遍历和广度遍历算法,这通常通过递归或队列实现,以访问树中的每个节点。 N叉树是一种每个节点有多个子节点的树形结构,它在很多场景下都有应用,如文件系统...

    C#数据结构与算法(睿智汇海 李元波)7

    5. **树结构**:树是一种非线性数据结构,包括二叉树、二叉搜索树、平衡树(如AVL树和红黑树)等。了解它们的性质、操作和在实际问题中的应用。 6. **图**:图数据结构用于表示对象之间的关系,学习图的基本概念、...

    数据结构的课件及其习题

    本课件主要关注的是数据结构中的树和二叉树部分,包括了各种基本操作和算法。 首先,二叉树是一种特殊的树形数据结构,每个节点最多有两个子节点,分别称为左子节点和右子节点。在C语言中,可以使用结构体来表示...

    陈广 C#数据结构视频 第5章 树(1)

    树是一种非线性数据结构,它的形态模拟了自然界中的层级关系,因此在很多算法和系统设计中都有广泛的应用。本章节主要从基础概念出发,逐步引导学习者理解树的特性和操作。 首先,我们要理解什么是树的基本元素。树...

    线索二叉树用c#实现

    这种数据结构在计算机科学中尤其在算法和数据结构的学习中具有重要意义,因为它允许我们高效地查找前驱和后继节点,而无需额外的数据结构。下面我们将详细讨论线索二叉树的概念、C#实现以及其在实际应用中的价值。 ...

    C#开发数据结构教程.rar

    在C#中,Stack和Queue类分别代表了这两种数据结构,可用于实现递归、表达式求值等多种任务。 树是一种非线性数据结构,常见的有二叉树和二叉搜索树。二叉树每个节点最多有两个子节点,二叉搜索树则保证左子树所有...

Global site tag (gtag.js) - Google Analytics