树的学习
1.基本概念
结点的度:树中每个结点具有的非空子树数或者说后继结点数被定义为该结点的度。(比如上图A节点的度为2,O节点的度为0)
树的度:树中所有结点的度的最大值被定义为该树的度。(比如B节点的度为3)
叶子结点:度等于0的结点称为叶子结点或终端结点。
分支结点:度大于0的结点称为分支结点或非终端结点。每个结点的分支数就是该结点的度数。
在一棵树中,每个结点的子树的根(或者说每个结点的后继)被称为孩子结点,该结点被称为父亲结点。(B节点子树为D,E,F,B节点为他们的父节点或者根)
结点的层数从树根开始定义,根结点为第一层,它的孩子结点为第二层,以此类推。树中结点最大层数称为树的深度或高度。
二叉树:是指树的度为2的有序树。
满二叉树:当二叉树中的每一层都满时(结点数为2^(i-1)),则称此树为满二叉树。
完全二叉树:二叉树中,除最后一层外,其余层都是满的,并且最后一层或者是满的,或者是在最右边缺少连续若干个结点,则称此树为完全二叉树。
理想平衡二叉树:二叉树中,除最后一层外,其余层都是满的,并且最后一层的结点可以任意分布,则称此树为理想平衡二叉树。理想平衡二叉树包含满二叉树和完全二叉树。
2.二叉树的存储结构
a.顺序存储结构
从二叉树的根节点起,顺序的从左到右对节点进行编序,然后把各节点存储到一个数组中。
b.链式存储结构
每个结点设置三个域:左孩子、值域、右孩子。
typedef struct BTreeNode { dataType data;//值域 struct BTreeNode *lChild;//左孩子 struct BTreeNode *rChild;//右孩子 }BiTNode, *BiTree;
3.二叉树的遍历
a,先序遍历
b,中序遍历
c,后序遍历
d,按层遍历
4.二叉树的操作以及运算
#include <stdio.h> #include <stdlib.h>
//节点类型 typedef char DataType ; //二叉树的节点 typedef struct BiTNode { DataType data; struct BiTNode *lchild, *rchild; }BiTnode, *BiTree;
//先序创建二叉树 void BiTree_create(BiTree *node) { char c; scanf("%c", &c); getchar(); if(c == '#') return; *node = (BiTree)malloc(sizeof(BiTnode)); (*node)->data = c; (*node)->lchild = NULL; (*node)->rchild = NULL; BiTree_create(&((*node)->lchild)); BiTree_create(&((*node)->rchild)); }
//先序遍历二叉树 void BiTree_preorder(BiTree *node) { if(*node == NULL) return; printf("%c",(*node)->data); BiTree_preorder(&((*node)->lchild)); BiTree_preorder(&((*node)->rchild)); }
//中序遍历二叉树 void BiTree_inorder(BiTree *node) { if(*node == NULL) return; BiTree_inorder(&((*node)->lchild)); printf("%c", (*node)->data); BiTree_inorder(&((*node)->rchild)); }
//后序遍历二叉树 void BiTree_postorder(BiTree *node) { if(*node == NULL) return; BiTree_postorder(&((*node)->lchild)); BiTree_postorder(&((*node)->rchild)); printf("%c", (*node)->data); } int main() { BiTree tree = NULL; // tree = (BiTree)malloc(sizeof(BiTnode)); BiTree_create(&tree); BiTree_preorder(&tree); BiTree_inorder(&tree); BiTree_postorder(&tree); return 0; }