数据结构 - 树(一)

树的数组表示法
使用下标对应的方法来做

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

namespace DataStruct_Pro.Tree
{
    class Class1
    {
        public static void Main(string[] args)
        {
            int i, level;
            int[] data = { 6, 3, 5, 9, 7, 8, 4, 2 }; //原始数据
            int[] btree = new int[16];//二叉树的本体
            for (i = 0; i < btree.Length; i++) btree[i] = 0; //赋初始值为0
            Console.Write("原始数据:");
            for (i = 0; i < data.Length; i++)
            {
                Console.Write("[{0}]", data[i]);
            }
            Console.WriteLine();
            for (i = 0; i < data.Length; i++)   //遍历原始数据数组
            {
                for(level = 1;btree[level] != 0;)
                {
                    if (data[i] > btree[level])
                    {
                        level = level * 2 + 1;
                    }
                    else
                        level = level * 2;
                }
                btree[level] = data[i];  //将数据放入二叉树
            }
            Console.Write("二叉树内容:\n");
            for (i = 1; i < btree.Length; i++)
            {
                Console.Write("[{0}]", btree[i]);
            }
            Console.WriteLine();
            Console.ReadLine();
        }
    }
}

树的链表表示

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

namespace DataStruct_Pro.Tree
{
    class TreeNode
    {
        public int value;
        public TreeNode left_node;
        public TreeNode right_node;
        public TreeNode(int value)
        {
            this.value = value;
            this.left_node = null;
            this.right_node = null;
        }
    }
    class BinaryTree
    {
        public TreeNode rootNode;
        public BinaryTree(int[] data)
        {
            for(int i = 0; i < data.Length; i++)
            {
                this.Add_Node_To_Tree(data[i]);
            }
        }
        public void InOrder(TreeNode node)
        {
            if(node != null)
            {
                InOrder(node.left_node);
                Console.Write("[{0}]", node.value);
                InOrder(node.right_node);
            }
        }
        public void PostOrder(TreeNode node)
        {
            if(node != null)
            {
                PostOrder(node.left_node);
                PostOrder(node.right_node);
                Console.Write("[{0}]", node.value);
            }
        }
        public void PreOrder(TreeNode node)
        {
            if(node != null)
            {
                Console.Write("[{0}]", node.value);
                PreOrder(node.left_node);
                PreOrder(node.right_node);
            }
        }
        public void Add_Node_To_Tree(int value)
        {
            TreeNode currentNode = rootNode;
            if(rootNode == null)
            {
                rootNode = new TreeNode(value);
                return;
            }
            while (true)
            {
                if(value < currentNode.value)
                {
                    if (currentNode.left_node == null)
                    {
                        currentNode.left_node = new TreeNode(value);
                        return;
                    }
                    else
                        currentNode = currentNode.left_node;
                }
                else
                {
                    if (currentNode.right_node == null)
                    {
                        currentNode.right_node = new TreeNode(value);
                        return;
                    }
                    else
                        currentNode = currentNode.right_node;
                }
            }
        }
    }

    class Class2
    {
        public static void Main(string[] args)
        {
            Console.WriteLine("请输入需要多少个节点的树:");

            int ArraySize = Convert.ToInt32(Console.ReadLine());
            int tempData;
            int[] content = new int[ArraySize];
            Console.WriteLine("请连续输入{0} 个数据.", ArraySize);
            for(int i = 0; i < ArraySize; i++)
            {
                Console.Write("请输入第{0} 个数据: ", i + 1);
                tempData = Convert.ToInt32(Console.ReadLine());
                content[i] = tempData;
            }
            var tree = new BinaryTree(content);
            Console.WriteLine("创建二叉树成功");
            Console.WriteLine("=========================");
            tree.InOrder(tree.rootNode);
            Console.ReadLine();
        }
    }
}


Python版

class TreeNode:
    def __init__(self,value):
        self.value = value
        self.Right = None
        self.Left = None
class BinaryTree:
    def __init__(self,content):
        self.root = None
        for i in content:
            self.CreateTree(i)
    def CreateTree(self,value):
        current = self.root
        if self.root is None:
            self.root = TreeNode(value)
            return
        while(True):
            if(value < current.value):
                if(current.Left == None):
                    current.Left = TreeNode(value)
                    return
                else:
                    current = current.Left
            else:
                if(current.Right == None):
                    current.Right = TreeNode(value)
                    return
                else:
                    current = current.Right
    def MidOrder(self,node):

        if(node != None):
            self.MidOrder(node.Left)
            print("["+str(node.value)+"]")
            self.MidOrder(node.Right)



if __name__ == "__main__":
    ArraySize = int(input())
    i = 0
    myList = []
    while(i < ArraySize):
        print("请输入第"+str((i+1)),"个数据: ")
        temp = int(input())
        myList.append(temp)
        i = i + 1
    tree = BinaryTree(myList)
    print("Done......")
    tree.MidOrder(tree.root)

这里有一个有趣的现象,就是当使用中序遍历二叉树的时候,所遍历出来的结果是排好序的。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43635647/article/details/104150741