代码内有详细注释
//
// Created by Cauchyshy on 2023/5/25.
//
#include <iostream>
#include <cstdio>
#include <malloc.h>
using namespace std;
struct treeNode {
int a; // 数据成员
struct treeNode *pFather; // 父节点
struct treeNode *pLeft; // 左孩子
struct treeNode *pRight; // 右孩子
};
//void insert(struct treeNode **root, int data) {
// // 创建节点 并且赋初值
// struct treeNode *tp = (struct treeNode *) malloc(sizeof(struct treeNode));
// if (NULL == tp) {
// return ; // 创建失败 直接结束
// }
// tp->a = data;
// tp->pLeft = NULL;
// tp->pRight = NULL;
// tp->pFather = NULL;
// // 节点连接到树上
// // 如果树根是空的 则该节点作为根节点
// if (NULL == *root) {
// *root = tp;
// } else {
// struct treeNode *temp = *root; // 定义中间变量遍历树
// // struct treeNode *ji = temp;
// // 循环找到接入点 因为找到后temp为NULL 没法操作 所以还得要个变量记录一下temp 等下做插入操作才行
// // 找到是父节点 因为没有记录左还是右 所以出来后还要判断一下
// struct treeNode *jilu = temp;
// while (temp != NULL) {
// jilu = temp;
// if (data > temp->a) {
// // 放右子树
// //jilu = temp;
// temp = temp->pRight;
// } else {
// //jilu = temp;
// temp = temp->pLeft; // 否则放在左子树
// }
// }
// // 出来后判断接在左子树还是右子树
// if (data > jilu->a) {
// // 接右子树
// jilu->pRight = tp;
// // tp->pFather = jilu;
// } else {
// // 否则接左子树
// jilu->pLeft = tp;
// // tp->pFather = jilu;
// }
// tp->pFather = jilu;
//
// }
//}
// 插入 算法优化 记录左右指针的地址 出去之后直接加即可
void insert(struct treeNode **root, int data) {
// 创建节点 并且赋初值
struct treeNode *tp = (struct treeNode *) malloc(sizeof(struct treeNode));
if (NULL == tp) {
return ; // 创建失败 直接结束
}
tp->a = data;
tp->pLeft = NULL;
tp->pRight = NULL;
tp->pFather = NULL;
// 节点连接到树上
// 如果树根是空的 则该节点作为根节点
if (NULL == *root) {
*root = tp;
} else {
struct treeNode *temp = *root; // 定义中间变量遍历树
// struct treeNode *ji = temp;
// 循环找到接入点 因为找到后temp为NULL 没法操作 所以还得要个变量记录一下temp 等下做插入操作才行
// 找到是父节点 因为没有记录左还是右 所以出来后还要判断一下
struct treeNode **jilu = NULL;
while (temp != NULL) {
// jilu = temp;
if (data > temp->a) {
jilu = &(temp->pRight); // 记录右指针地址
// 放右子树
//jilu = temp;
temp = temp->pRight;
} else {
// 记录左指针地址
jilu = &(temp->pLeft);
//jilu = temp;
temp = temp->pLeft; // 否则放在左子树
}
}
// 出来后就不需要判断 直接连接即可
*jilu = tp;
}
}
// 中序遍历
void look(struct treeNode *root) {
if (NULL != root) {
look(root->pLeft);
printf("%d ", root->a);
look(root->pRight);
}
}
void createTree(struct treeNode **root, int *arr, int len) {
for (int i = 0; i < len; ++i) {
insert(root, arr[i]);
}
}
int main() {
struct treeNode *root = NULL; // 树根
// insert(&root, 12);
// insert(&root, 13);
// insert(&root, 10);
// insert(&root, 12);
// 小技巧 如果想创建出来的排序树跟纸上画出来的一样(也就是结构一模一样) 只需要按照层序遍历的顺序插入即可
int arr[] = {7, 4, 8, 2, 5, 12, 1, 3, 9, 10};
createTree(&root, arr, 10);
look(root);
printf("\n");
return 0;
}