树和二叉树及C#实现

2019-08-03  本文已影响0人  周末的游戏之旅

树的相关术语

二叉树

把满足一下两个条件的树型结构叫做二叉数。

  1. 每个节点的度都不大于2;
  2. 每个节点的孩子节点次序不能任意颠倒

二叉树的性质

二叉树的遍历

二叉树的遍历有6中方式:
(1)访问根,遍历左子树,遍历右子树(记做DLR)。
(2)访问根,遍历右子树,遍历左子树(记做DRL)。
(3)遍历左子树,访问根,遍历右子树(记做LDR)。
(4)遍历左子树,遍历右子树,访问根(记做LRD)。
(5)遍历右子树,访问根,遍历左子树(记做RDL)。
(6)遍历右子树,遍历左子树,访问根(记做RLD)。
在以上6中方式中,如果规定按先左后右的顺序,那么就只剩DLR、LDR和LRD三种。
下面就分别介绍三种遍历方法的递归定义。
(1)先序遍历(DLR)操作过程若二叉树为空,则空操作,否则依次执行如下3个操作:
①访问根结点;
②按先序遍历左子树;③按先序遍历右子树。
(2)中序遍历(LDR)操作过程若二叉树为空,则空操作,否则依次执行如下3个操作:
①按中序遍历左子树;
②访问根结点;
③按中序遍历右子树。
(3)后序遍历(LRD)操作过程若二叉树为空,则空操作,否则依次执行如下3个操作:
①按后序遍历左子树;②按后序遍历右子树;
③访问根结点。
显然,遍历操作是一个递归过程。

三种遍历的实现

TreeNode

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

namespace Tree
{
    class TreeNode<T>
    {
        T data;
        TreeNode<T> LChrild;
        TreeNode<T> RChirld;
        
        public T Data { get => data; set => data = value; }
        internal TreeNode<T> LChrild1 { get => LChrild; set => LChrild = value; }
        internal TreeNode<T> RChirld1 { get => RChirld; set => RChirld = value; }

        public TreeNode(T data)
        {
            this.Data = data;
        }
    }
}

Program

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

namespace Tree
{
    class Program
    {
        static void Main(string[] args)
        {
            TreeNode<string> root = new TreeNode<string>("a");
            TreeNode<string> L = new TreeNode<string>("b");
            TreeNode<string> R = new TreeNode<string>("c");
            root.LChrild1 = L;
            root.RChirld1 = R;
            DLR(root);
            Console.WriteLine("----");
            LDR(root);
            Console.WriteLine("----");
            LRD(root);
        }

        /// <summary>
        /// 先序遍历
        /// </summary>
        /// <param name="root"></param>
        static void DLR(TreeNode<string> root)
        {
            if (root != null)
            {
                Console.WriteLine(root.Data);
                DLR(root.LChrild1);
                DLR(root.RChirld1);
            }
        }

        /// <summary>
        /// 中序遍历
        /// </summary>
        /// <param name="root"></param>
        static void LDR(TreeNode<string> root)
        {
            if (root != null)
            {
                LDR(root.LChrild1);
                Console.WriteLine(root.Data);
                LDR(root.RChirld1);
            }
        }

        /// <summary>
        /// 后序遍历
        /// </summary>
        static void LRD(TreeNode<string> root)
        {
            if (root != null)
            {
                LRD(root.LChrild1);
                LRD(root.RChirld1);
                Console.WriteLine(root.Data);
            }
        }
    }
}
上一篇 下一篇

猜你喜欢

热点阅读