二叉树1——创建与插入节点
来源:互联网 发布:网络服务器托管 编辑:程序博客网 时间:2024/06/06 05:20
二叉树在图论中是这样定义的:二叉树是一个连通的无环图,并且每一个顶点的度不大于3。有根二叉树还要满足根结点的度不大于2。有了根结点之后,每个顶点定义了唯一的父结点,和最多2个子结点。然而,没有足够的信息来区分左结点和右结点。如果不考虑连通性,允许图中有多个连通分量,这样的结构叫做森林。
在计算机科学中,二叉树是每个节点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用于实现二叉查找树和二叉堆。
二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒。二叉树的第i层至多有2^{i-1}个结点;深度为k的二叉树至多有2^k-1个结点;对任何一棵二叉树T,如果其终端结点数为n_0,度为2的结点数为n_2,则n_0=n_2+1。
一棵深度为k,且有2^k-1个节点称之为满二叉树;深度为k,有n个节点的二叉树,当且仅当其每一个节点都与深度为k的满二叉树中,序号为1至n的节点对应时,称之为完全二叉树。
本文主要讲的是一些关于二叉树的操作。
首先我依旧先建立几个数据结构;
typedef char BTreeData;// 二叉树的结点typedef struct _btreeNode{ BTreeData data; struct _btreeNode *lchild; // 指向左孩子结点的指针 struct _btreeNode *rchild; // 指向右孩子结点的指针}BTreeNode;
一个树节点的数据结构,其中有BTreeData类型的数据,一个指向左孩子的节点的指针lchild,指向右孩子节点的指针rchild.
typedef struct _btree{ BTreeNode *root; // 指向二叉树的根节点 int count; // 记录二叉树结点的个数}BTree;
一个树的数据结构,有一个指向根节点的指针,和一个记录节点数的count。
有了这两个数据结构,一个二叉树的框架就搭建起来了。下面我们开始一些相关的操作。
创建二叉树:
BTree *Create_BTree(){ BTree *btree = (BTree*)malloc(sizeof(BTree)/sizeof(char)); if (btree == NULL) return NULL; btree->count = 0; btree->root = NULL; return btree;}
创建二叉树比较简单,将根节点置为NULL就好了。并给树赋长度0;
插入节点:
int Btree_Insert(BTree *tree, BTreeData data, int pos, int count, int flag){ if (tree == NULL || (flag != BLEFT && flag != BRIGHT)) return FALSE; BTreeNode *node = (BTreeNode*)malloc(sizeof(BTreeNode)/sizeof(char)); if (node == NULL) return FALSE; node->data = data; node->lchild = NULL; node->rchild = NULL; // 找插入的位置 BTreeNode *parent = NULL; BTreeNode *current = tree->root; // current 一开始指向根节点,根节点的父节点是空 int way; // 保存当前走的位置 while (count > 0 && current != NULL) { way = pos & 1; // 取出当前走的方向 pos = pos >> 1; // 移去走过的路线 // 因为当前位置就是走完以后的位置的父节点 parent = current; if (way == BLEFT) // 往左走 current = current->lchild; else current = current->rchild; count--; } // 把被替换掉的结点插入到新节点下面 if (flag == BLEFT) node->lchild = current; else node->rchild = current; // 把新节点插入到二叉树中,way保存了应该插入在父节点的左边还是右边 if (parent != NULL) { if (way == BLEFT) parent->lchild = node; else parent->rchild = node; } else { tree->root = node; // 替换根节点 } tree->count ++; return TRUE;}
二叉树的插入相对树的插入就简单了许多,但也是需要一番理解的,首先,需要找到想要插入的地方,然后用新建的节点替换原来的节点,然后根据需要将原先节点以及它的“子子孙孙”们加入到新建节点的左边或右边。总体来说也不是很难。
- 二叉树1——创建与插入节点
- 树1——创建与插入节点
- 二叉树节点的插入与删除
- Linux c 二叉搜索树(节点创建、插入BST)
- lintcode——在二叉查找树中插入节点
- 平衡二叉树插入节点
- 二叉搜索树 插入节点
- 二叉树中插入节点的递归与非递归
- 数据结构与算法分析(Java语言描述)(16)—— 二叉搜索树基础、节点插入、查找
- 每天一点数据结构之二叉树的插入与创建
- 向二叉树中插入节点
- 二叉搜索树的根节点插入
- 在二叉查找树中插入节点
- 在二叉查找树中插入节点
- 在二叉查找树中插入节点
- 在二叉查找树中插入节点
- LintCode(S)二叉查找树插入节点
- 在二叉查找树中插入节点
- API网关orange在ubuntu安装记录
- HDU 2094 产生冠军
- Cross Compile iptables
- 1110. Complete Binary Tree (25)完全二叉树
- 线程的四种状态以及wait和sleep的区别
- 二叉树1——创建与插入节点
- 设计模式-观察模式
- Xutils创建数据库添加数据
- MVG读书笔记——射影变换的校正(一)
- Linux下双网卡桥接
- hdu6071 2017hdu多校第四场
- Django简单总结
- 计算机进制之间的转换
- 【NOIP2017】Day3