二叉树(二叉树相关的算法c++实现)

二叉树是什么?

    二叉树就是每个节点(Node)最多只有两个子节点的树结构,且子树有左右之分,不能任意颠倒顺序.

《二叉树(二叉树相关的算法c++实现)》

    根据二叉树的特性,便有了二叉排序树. 一般数据以二叉树作为数据结构储存时,都是按照二叉排序树的一般规则(“小放左,大放右”).

《二叉树(二叉树相关的算法c++实现)》

为了各位检验,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);
}

    原文作者:kissablemt
    原文地址: https://blog.csdn.net/kissablemt/article/details/79477924
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞