美文网首页
按树状横向打印二叉树

按树状横向打印二叉树

作者: 周末的游戏之旅 | 来源:发表于2019-08-03 10:40 被阅读0次

    问题

    假设以二叉链表存储的二叉树中,每个结点所含数据元素均为单字母。 要求实 现二叉树的横向显示问题,如下图所示打印结果。


    问题分析

    (1) 二叉树的横向显示应是二叉树竖向显示的90°旋转。分析上图可知,这种树形打印格式要求先打印右子树,再打印根,最后打印左子树,按由上而下顺序看,其输出的结点序列为:CFEADB,这恰为逆中序遍历。所以横向显示二叉树的算法为先右子树、再跟结点、再左子树的RDL结构。
    (2)在这种输出格式中,结点的左右位置与结点的深度有关,故算法中设置了一个表实当前跟结点层深的参数,以控制输出结点的左、右位置,每当递归进层时层深参数加1。

    算法描述

    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;
            }
            public TreeNode()
            {
                this.Data = default(T);
                this.LChrild1 = null;
                this.RChirld1 = null;
            }
        }
    }
    

    Program

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace Tree
    {
        class Program
        {
            static int total = 0; //叶子结点数目
    
            static void Main(string[] args)
            {
                TreeNode<string> A = new TreeNode<string>("a");
                TreeNode<string> B = new TreeNode<string>("b");
                TreeNode<string> C = new TreeNode<string>("c");
                TreeNode<string> D = new TreeNode<string>("d");
                TreeNode<string> E = new TreeNode<string>("e");
                TreeNode<string> F = new TreeNode<string>("f");
                TreeNode<string> G = new TreeNode<string>("g");
                TreeNode<string> H = new TreeNode<string>("h");
    
                A.LChrild1 = B;
                B.RChirld1 = D;
                A.RChirld1 = C;
                D.LChrild1 = F;
                D.RChirld1 = G;
                C.RChirld1 = E;
                E.RChirld1 = H;
    
                PrintTree(A, 0);
            }
    
            /// <summary>
            /// 逆中序(RDL)遍历实现横向(从屏幕左到屏幕右)梳妆打印
            /// </summary>
            /// <param name="node"></param>
            /// <param name="space"></param>
            static void PrintTree(TreeNode<string> node,int space)
            {
                if (node == null)
                    return;
                PrintTree(node.RChirld1, space + 1);
                for (int i = 0; i < space; i++)
                {
                    Console.Write("  ");
                }
                Console.WriteLine(node.Data);
                PrintTree(node.LChrild1, space+1);
            }
        }
    }
    

    相关文章

      网友评论

          本文标题:按树状横向打印二叉树

          本文链接:https://www.haomeiwen.com/subject/iutjdctx.html