定义与性质
二叉树的每个节点至多只有两棵子树,二叉树的子树有左右之分,不可颠倒。二叉树的第i层至多有2^(i-1)个节点;深度为k的二叉树的节点至多有2^k - 1个节点;对任一个二叉树,其叶子节点的个数为n,度为2的节点个数为m,n = m + 1 。(摘自wiki)
节点定义
typedef struct BinaryTreeNode
{
char value;
struct BinaryTreeNode* lchild;
struct BinaryTreeNode* rchild;
}node, *BTree;
建立
下面的代码可以生成上图所示的二叉树。
/*
建立二叉树
输入范例:123##45###6##
*/
BTree Create(BTree T)
{
char v;
v = getchar();
if(v == '#')
T = NULL;
else
{
T = (node*) malloc(sizeof(node));
if(!T)
exit(0);
T->value = v;
T->lchild = Create(T->lchild);
T->rchild = Create(T->rchild);
}
return T;
}
遍历
前序遍历
前序遍历的含义是先访问根节点,再访问根节点的左子树,然后访问右子树。
递归实现
/*
前序遍历二叉树(递归)
*/
void preOrder(BTree T)
{
if(T)
{
printf("%c ", T->value);
preOrder(T->lchild);
preOrder(T->rchild);
}
}
非递归实现
可以将每一个节点都看做是根节点,前序遍历的非递归处理过程如下:
对每个节点node,有
1. 访问node,将node入栈
2. 判断node的左孩子节点是否为空。若为空,则将node出栈,并将node设为node的右孩子节点,重复第一步;若不为空 ,则将node设为node