#include <iostream>
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
using namespace std;
//结构定义
typedef struct Node{
int val;
struct Node *lchild, *rchild;
}Node;
//根节点
typedef struct tree {
Node *root;
int n;
}Tree;
Node *getNewNode(int val) {
Node *p = (Node *)malloc(sizeof(Node));
p->val = val;
p->lchild = p->rchild = NULL;
return p;
}
Tree *getNewTree() {
Tree *tree = (Tree *)malloc(sizeof(Tree));
tree->n = 0;
tree->root = NULL;
return tree;
}
//插入操作 顺序插入 左小右边大
Node *insertNode(Node* root ,int val,int *rel) {
if (root == NULL)
{
*rel = 1;
return getNewNode(val);
}
if (root->val == val) return root;
//顺序插入
if (root->val > val) root->lchild = insertNode(root->lchild, val, rel);
else root->rchild = insertNode(root->rchild, val, rel);
return root;
}
void insert(Tree *tree,int val) {
int flag = 0;
tree->root = insertNode(tree->root,val,&flag);
tree->n += flag;
return;
}
//销毁操作
void clearNode(Node *node) {
if (node == NULL) return;
clearNode(node->lchild);
clearNode(node->rchild);
free(node);
return;
}
void clearTree(Tree *tree) {
if (tree == NULL) return;
clearNode(tree->root);
free(tree);
return;
}
//输出节点 转换为广义表
void OutputNode(Node *node) {
if (node == NULL) return;
printf("%d",node->val);
if (node->lchild == NULL && node->rchild == NULL)return;
printf("(");
OutputNode(node->lchild);
printf(",");
OutputNode(node->rchild);
printf(")");
return;
}
//输出树
void OutputTree(Tree *tree) {
printf("tree(%d)= ", tree->n);
OutputNode(tree->root);
printf("\n");
return ;
}
//中序遍历
void inorderNode(Node * node) {
if (node == NULL) return;
inorderNode(node->lchild);//左 根 右
printf(" %d",node->val);
inorderNode(node->rchild);
return;
}
void inorder(Tree* tree) {
printf("in order: ");
inorderNode(tree->root);
printf("\n");
return;
}
int main() {
srand(time(0));
Tree * tree = getNewTree();
for (int i = 0; i < 10; i++) {
int val = rand()%100;
insert(tree,val);
OutputTree(tree);
}
inorder(tree);
clearTree(tree);
return 0;
}
二叉顺序树代码实现(C++)
最新推荐文章于 2024-10-25 16:21:17 发布