创建二叉树

from nuanyangyang大神。。

你需要一个领域专门语言(DSL)

erchashu = (
        (
            (
                (),
                1,()
                ),
            2,
            (
                (),
                3,
                ())
            ),
        4,
        (
            (
                (
                    (),
                    5,
                    (
                        (),
                        6,
                        ()
                        ),
                    ),
                7,
                (
                    (
                        (),
                        8,
                        ()
                        ),
                    9,
                    (
                        (),
                        10,
                        ()
                        )
                    )
                )
            )
        )

def inorder(tree):
    if tree == ():
        return
    else:
        l, m, r = tree
        inorder(l)
        print(m)
        inorder(r)

inorder(erchashu)

  Python语言。我用空元组,即“()”表示叶子节点,用三元组(l, m, r)表示分支节点。数据存储在分支节点上,叶子节点都是空的。这样,空树就表示为(),只有根的树表示为((), 42, ()),其中42可以换成随便什么数据。于是,可以用这种方法组合出比较复杂的树,比如:
(  ((),1,()),     2,      ((),3,()))
这就是一个有3个节点的树。

struct Node {
    Node* left;
    int data;
    Node* right;
};

  然后创建两个函数来构造它们:

// 用br创建分支节点,带数据
Node* br(Node *left, int data, Node *right) {
    Node *n = new Branch();
    n->left = left;
    n->data = data;
    n->right = right;
    return n;
}

// 用lf创建叶子节点,没有数据
Node* lf() {
    return nullptr;
}

  那么同样的树可以写成:

Node *root = br(  br(lf(),1,lf()),     2,      br(lf(),3,lf()));

  如果这个还麻烦,可以加一个创建“只有数据没有孩子的分支节点”:

Node* bs(int data) {
    return br(nullptr, data, nullptr);
}

Node *root = br( bs(1), 2, bs(3));

  还嫌麻烦的话,可以把bs改名叫br,反正C++允许函数名重载。

其实不管怎么样,树的每个节点都要创建。麻烦的只是表达方式。有一个好的语言,就会很简单。

时间: 2024-10-08 08:26:43

创建二叉树的相关文章

创建二叉树、创建链表等

方法一: 1 #include <iostream>//创建二叉树,要用二级指针 2 3 using namespace std; 4 5 typedef struct TreeNode 6 { 7 char data; 8 struct TreeNode *left; 9 struct TreeNode *right; 10 }BiTree; 11 12 void creatBitree(BiTree **T) 13 { 14 char ch; 15 cin >> ch; 16

先序遍历创建二叉树,对二叉树统计叶子节点个数和统计深度(创建二叉树时#代表空树,序列不能有误)

#include "stdio.h" #include "string.h" #include "malloc.h" #define NULL 0 #define MAXSIZE 30 typedef struct BiTNode      //定义二叉树数据结构 { char data; struct BiTNode *lchild,*rchild; } BiTNode; void preCreate(BiTNode *& T)   /

层次创建二叉树

第一种: 主要是利用 树结点类型的数组.二叉树结点序号之间的关系 来创建: 父结点序号为 i 则,左儿子结点序号为 2*i ,右儿子序号为 2*i+1. //用层次遍历的方法来创建二叉树 #include <iostream> #include <queue> using namespace std; //二叉链表的结构类型定义 const int maxsize=1024; typedef char datatype; typedef struct node { datatype

创建二叉树 树的深度搜索 广度搜索

树的深度搜索 与树的前序遍历同理 根节点->左孩子->右孩子  树的广度搜索 与树的层次遍历同理 一层一层遍历内容 深度搜索 采用stack的适配器 先进后出原则  而广度搜索采用的queue适配器 先进先出原则 二者正好满足 搜索需求 简要代码如下: #include <iostream> #include <stack> #include <queue> #include <malloc.h> using namespace std; typ

数据结构上机 【创建二叉树,并采用先中后序遍历,输出树高,度数为分别为0 1 2 的结点个数】

#include<stdio.h> #include<string.h> #include<stdlib.h> #include<algorithm> #include<malloc.h> #define null 0 using namespace std; typedef struct node { int data;//节点 node *lchild,*rchild; }node,*Tree; typedef struct{ Tree to

创建二叉树实例

1.#include <stdio.h>#include <stdlib.h>#include "BTree.h" /* run this program using the console pauser or add your own getch, system("pause") or input loop */ struct Node{    BTreeNode header;    char v;}; void printf_data(

非递归创建二叉树( C++队列 )

非递归按照 层序 创建二叉树,利用 队列(即可先进先出特点)存放已访问的结点元素的地址. 初始化:front=rear= -1: 每储存一个结点元素 rear+1 ,利用 rear%2==0 来使 front+1 回车表示结点输入完毕 1 // 结构体 2 struct Node { 3 char data; 4 Node * lchild; 5 Node * rchild; 6 }; 7 /* 类 class Tree中的私有构造方法 Node * Create() 8 注:该方法需要 以层序

创建二叉树来实现指路问题

生活中我们经常会遇到这样的问题,对话如下.路人:“同学,请问湘大图书馆怎么走啊?” 学生:“前面路口左转,然后直走,第三个路口左转,之后再右转就到了.”这里就涉及到创建二叉树来解决此类问题的方法了. 指路法定位结点 从根节点开始: 结点1的位置: { NULL } 结点2的位置: { 左 } 结点3的位置: { 右 } 结点4的位置: { 左,左 } 结点5的位置: { 左,右 } 结点6的位置: { 右,左 } 结点7的位置: { 右,右 } 结点8的位置: { 左,左,左 } 结点9的位置:

算法题---创建二叉树及测试程序时的输入方法

创建二叉树的算法中,字符串的输入必须是按先序次序输入,先序遍历二叉树时空树以#代替,以图1-1为例,应该输入的字符串顺序为:ABE##F##CG###(最后一个#是结束符),"#"表示空树,如下图所示: void CreateBiTree(BiTree &T) { char ch; cin >> ch; if (ch == '#') {T = NULL;} else { T = (Node*)malloc(sizeof(Node)); T->data = ch

创建二叉树的两种方法以及三种遍历方法

二叉树的两种创建方法和三种遍历方法 这里的两种创建方法,一种值得是 数据结构上面的创建方法: 方法一 代码如下: 二叉树的结构定义如下: typedef struct BinaryTreeNode{ char value; struct BinaryTreeNode *left; struct BinaryTreeNode *right; }; - c语言版 void CreateBinaryTree(BinaryTreeNode **T) { char data; scanf("%d"