二叉树是什么?
二叉树就是每个节点(Node)最多只有两个子节点的树结构,且子树有左右之分,不能任意颠倒顺序.
根据二叉树的特性,便有了二叉排序树. 一般数据以二叉树作为数据结构储存时,都是按照二叉排序树的一般规则(“小放左,大放右”).
为了各位检验,main()函数和测试数据在最后给出.
二叉树节点定义
typedef struct BinaryTreeNode {
int value;
struct BinaryTreeNode *leftNode;
struct BinaryTreeNode *rightNode;
} BTN;
二叉排序树创建
void CreateTree(BTN* &root, int data) { // data 表示即将要插入的值
BTN *temp = NULL, *cur, *pre;
if ((temp = (BTN *)malloc(sizeof(BTN))) == NULL) //申请空间,创建temp保存新值
exit(EXIT_FAILURE);
temp->value = data; //temp初始化
temp->leftNode = temp->rightNode = NULL;
if (root == NULL) {
root = temp;
return;
}
cur = root;
while (cur != NULL) {
if (data > cur->value) {
pre = cur;
cur = cur->rightNode;
}
else if (data < cur->value) {
pre = cur;
cur = cur->leftNode;
}
else
return; // 一般"相等值"抛弃
}
if (data > pre->value)
pre->rightNode = temp;
else
pre->leftNode = temp;
}
写了这么个建树函数后,一定是需要检验的了,而检验的方法,一般就是列出四个遍历方式(先序,中序,后序,按层),判断是否正确咯.
这里给出各种遍历的代码.
先序遍历
void PreorderTraversal(BTN *root) {
if (root != NULL) {
printf(" %d ", root->value);
preorderTraversal(root->leftNode);
preorderTraversal(root->rightNode);
}
}
中序遍历(一般可认作从小到大输出)
void InorderTraversal(BTN *root) {
if (root != NULL) {
inorderTraversal(root->leftNode);
printf(" %d ", root->value);
inorderTraversal(root->rightNode);
}
}
后序遍历
void PostorderTraversal(BTN *root) {
if (root != NULL) {
postorderTraversal(root->leftNode);
postorderTraversal(root->rightNode);
printf(" %d ", root->value);
}
}
按层遍历 (我认为思想与bfs(宽度搜索)完全一样). 按层遍历十分重要,下面几种二叉树相关的算法我都是用次实现的.
void LevelTraversal(BTN **read, BTN **last)
{
printf(" %d ", (*read)->value);
if ((*read)->leftNode != NULL) {
last++;
*last = (*read)->leftNode;
}
if ((*read)->rightNode != NULL) {
last++;
*last = (*read)->rightNode;
}
read++;
if (read == last && (*last)->leftNode == NULL && (*last)->rightNode == NULL)
printf(" %d ", (*last)->value);
else
levelTraversal(read, last);
}