//n0表示叶子节点的个数,n2表示度为2的非叶子节点的个数,那么两者满足关系n0 = n2 + 1,
//n1表示度为1的非叶子节点的个数 ,有总结点数n = n0 + n1 + n2
/*
二叉树的遍历:
2.链式存储结构
//n1表示度为1的非叶子节点的个数 ,有总结点数n = n0 + n1 + n2
/*
二叉树的遍历:
先序:根,左子树,右子树*/
中序:左子树,根,右子树
后序:左子树,右子树,根
层次遍历:从上到下,从左到右
//二叉树的创建typedef struct TreeNode *BinTree typedef struct TreeNode { ElemType Data; BinTree Left; BinTree Right; }
1.顺序存储结构(创建完全二叉树)void CreatTree(BinTree &T) { //按先序次序输入二叉树中结点的值(一个字符),空格字符表示空树, //构造二叉链表表示的二叉树T char ch; ch = getchar(); if(ch == 'Q') T = NULL;//Q也可为空格等字符,表示为空树 else { if(!(T = (BinTree *)malloc(sizeof(BinTree)))) exit(1); T->data = ch; CreatTree(T->Left); CreatTree(T->Right); } return ; }
完全二叉树
特点:非根结点的父节点的序号是[i/2];2i <= n,否则没有左孩子2i + 1 <= n ,否则没有右孩子一般二叉树 填充空缺位,造成空间浪费。
2.链式存储结构
//二叉树的遍历:采用递归的方法
//先序遍历
void PreOrderTraversal( BinTree BT ) { if(BT) //指针不为空 { printf("%d ",BT->Data); PreOrderTraversal( BT->Left); PreOrderTraversal( BT->Right) } else return; }
//中序遍历
void InOrderTraversal( BinTree BT ) { if(BT) //指针不为空 { PreOrderTraversal( BT->Left); printf("%d ",BT->Data); PreOrderTraversal( BT->Right) } else return; }
//后序遍历
//二叉树的销毁void PostOrderTraversal( BinTree BT ) { if(BT) //指针不为空 { PreOrderTraversal( BT->Left); PreOrderTraversal( BT->Right) printf("%d ",BT->Data); } else return; }
void DestroyTree( BinTree BT )//递归删除子树 { if(BT) //指针不为空 { PreOrderTraversal( BT->Left); PreOrderTraversal( BT->Right) free(BT); } else return; }