二叉树的四种实现

作者:冯老师,华清远见嵌入式学院讲师。

一、二叉树的第一种实现

下面程序实现的是一个完全二叉树,其中树形结构的结点为1,2,……,n.

typedef char dtype;
        typedef struct node
        {
            dtype data;
            struct node * left;
            struct node * right;
        }bitree;
        bitree * bitree_create(int i, int n)
        {
            bitree * r;
            if ((r = (bitree *)malloc(sizeof(bitree))) == NULL)
            {
                printf("malloc failed\n");
                return NULL;
            }
            r->data = i;
            r->left = 2*i <= n ? bitree_create(2*i, n) : NULL;
            r->right = 2*i + 1 <= n ? bitree_create(2*i+1, n) : NULL;
            return r;
        }

调用程序如下:

if ((r = bitree_create(1, 8)) == NULL)
        return 0;

二、二叉树的第二种实现

由于第一个程序树形结构的结点固定为1,2,……,n. 若想让其结点数据,为用户需要的数值,可以做如下调整:

typedef char dtype;
        typedef struct node
        {
            dtype data;
            struct node * left;
            struct node * right;
        }bitree;
        bitree * bitree_create(int i, int n, dtype a[])
        {
            bitree * r;
            if ((r = (bitree *)malloc(sizeof(bitree))) == NULL)
            {
                printf("malloc failed\n");
                return NULL;
            }
            r->data = a[i];
            r->left = 2*i <= n ? bitree_create(2*i, n, a) : NULL;
            r->right = 2*i + 1 <= n ? bitree_create(2*i+1, n, a) : NULL;
            return r;
}

调用程序如下:

dtype a[] = {‘ ‘, ‘A‘, ‘B‘, ‘C‘};
        char s[] = {‘d‘, ‘c‘, ‘f‘};
        if ((r = bitree_create(1, sizeof(a)/sizeof(dtype)-1, a)) == NULL)
        return 0;

即把结点在树中的编号,作为了一个数组的下标,而数组元素的内容,是由用户来定义的。这样建立的完全二叉树,就比第一种更灵活。

三、二叉树的第三种实现

上面两种方法,建立的都是完全二叉树,若想建立任意形状的树,可以参考下面的程序

bitree * bitree_create()
        {
        bitree * r;
        
        char ch;
        
        scanf("%c", &ch);
        if (ch == ‘#‘)
        return NULL;
        
        if ((r = (bitree *)malloc(sizeof(bitree))) == NULL)
        {
        printf("malloc failed\n");
        return r;
        }
        
        r->data = ch;
        r->left = bitree_create();
        r->right = bitree_create();
        
        return r;
        }

调用程序如下:

bitree * r = NULL;
        if ((r = bitree_create()) == NULL)
        return 0;

执行程序时,得按树形结构的先序形式来输入。比如,若想建立上面所示的树,执行程序时得输入:

ABC##DE#G##F###

该程序利用了,把树节点没有的左或右孩子,用#来表示,这样作为递归的终止条件,就可以创建任意形状的树了。

四、二叉树的第四种实现

由于上面的程序树形结构的结点固定为字符行的变量. 若想让其结点数据,为用户需要的数值,可以做如下调整:

bitree * bitree_create2(dtype b[])
        {
        bitree * r;
        
        int ch;
        
        scanf("%d", &ch);
        if (ch == 4)
        return NULL;
        
        if ((r = (bitree *)malloc(sizeof(bitree))) == NULL)
        {
        printf("malloc failed\n");
        return r;
        }
        
        r->data = b[ch];
        r->left = bitree_create2(b);
        r->right = bitree_create2(b);
        
        return r;
        }

调用程序如下:

dtype b[] = {‘ ‘, ‘A‘, ‘B‘, ‘C‘, ‘D’, ‘E’, ‘F’, ‘G’, ‘#‘};
        if ((r = bitree_create2(b)) == NULL)
        return 0;

执行程序时,把树形结构中出现的结点,事先放到b数组中,到了相应结点的输入,只需要输入其在b数组中对应值的下标即可,比如,还建立第三种方法的树,应该输入:

1 2 3 8 8 4 5 8 7 8 8 6 8 8 8

文章来源:华清远见嵌入式学院原文地址:http://www.embedu.org/Column/Column899.htm

更多相关嵌入式免费资料查看华清远见讲师博文>>

时间: 2024-09-30 17:52:09

二叉树的四种实现的相关文章

二叉树的四种遍历方式

二叉树的四种遍历方式: 二叉树的遍历(traversing binary tree)是指从根结点出发,按照某种次序依次访问二叉树中所有的结点,使得每个结点被访问依次且仅被访问一次.四种遍历方式分别为:先序遍历.中序遍历.后序遍历.层序遍历. 遍历之前,我们首先介绍一下,如何创建一个二叉树,在这里博主宝宝用的是先建左树在建右树的方法, 首先要声明结点TreeNode类,代码如下: public class TreeNode { public int data; public TreeNode le

二叉树的四种遍历方法(递归、迭代)

一.前序遍历 前序遍历简单来讲,遍历顺序是:根节点-左子树-右子树 1.递归遍历 1 void preorder(BinTree *T) 2 { 3 if(T==NULL) 4 return; 5 cout << T->data; 6 preorder(T->left); 7 preorder(T->right); 8 } 2.迭代遍历(用栈实现) 1 void preorder2(BinTree *T) 2 { 3 //空树,直接返回 4 if(T==NULL) 5 ret

二叉树的四种遍历算法实现,没你想得那么难

二叉树的遍历 我用下图的树为例,做树的遍历: 二叉树结构 树节点的定义: public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } public TreeNode(int val, TreeNode left, TreeNode right) { super(); this.val = val; thi

二叉树的四种的非递归遍历算法

1 #include <iostream> 2 #include <stack> 3 #include <queue> 4 using namespace std; 5 struct BinTree 6 { 7 int data; 8 BinTree *lc; 9 BinTree *rc; 10 }BTNode,*BinTree; 11 12 //中序遍历的非递归算法 13 void InOrder(BinTree T) 14 { 15 stack<BinTree

二叉树的创建和四种遍历(前序、先序、后序、层次、结点的层数、深度、叶子数等)—java描述

二叉树的创建和四种遍历(前序.先序.后序.层次.结点的层数.深度.叶子数等)—java描述 package javab; //树的结点类 public class TreeNode { String data; TreeNode leftChild,rightChild,next; public TreeNode(String data){ this.data=data; } public TreeNode(String data,TreeNode left,TreeNode right){ l

C++算法之 求二叉树的节点个数、深度、四种遍历方法

//节点的数据结构 class BTree { public: int m_nValue; BTree* m_nLeft; BTree* m_nRight; public: BTree(int value) { m_nValue = value; } }; 一:求二叉树的节点个数: /* 求二叉数中的节点个数 递归解法: 1:如果二叉树为空,节点的个数为0 2:如果二叉树不为空,二叉树节点的个数 = 左子树节点个数+右子树节点的个数+1: */ int GetNodeCount(BTree* p

LeetCode算法题-Minimum Distance Between BST Nodes(Java实现-四种解法)

这是悦乐书的第314次更新,第335篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第183题(顺位题号是783).给定具有根节点值的二叉搜索树(BST),返回树中任何两个不同节点的值之间的最小差值.示例: 给定的树[4,2,6,1,3,null,null]由下图表示: 4 / 2 6 / \ 1 3 输出:1 说明:请注意,root是TreeNode对象,而不是数组.该树中的任意节点最小差值为1,它发生在节点1和节点2之间,也发生在节点3和节点2之间. 注意: BS

Java四种线程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecutor

介绍new Thread的弊端及Java四种线程池的使用,对Android同样适用.本文是基础篇,后面会分享下线程池一些高级功能. 1.new Thread的弊端 执行一个异步任务你还只是如下new Thread吗? Java new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub } }).start(); 1 2 3 4 5 6 7 new Thread(new

【转载】小结一下linux 2.6内核的四种IO调度算法

在LINUX 2.6中,有四种关于IO的调度算法,下面综合小结一下: 1) NOOP NOOP算法的全写为No Operation.该算法实现了最最简单的FIFO队列,所有IO请求大致按照先来后到的顺序进行操作.之所以说“大致”,原因是NOOP在FIFO的基础上还做了相邻IO请求的合并,并不是完完全全按照先进先出的规则满足IO请求.NOOP假定I/O请求由驱动程序或者设备做了优化或者重排了顺序(就像一个智能控制器完成的工作那样).在有些SAN环境下,这个选择可能是最好选择.Noop 对于 IO