二叉排序树 插入,创建,中序遍历,最大,最小值,层级,打印,删除,搜索

    xiaoxiao2022-06-29  54

    排序二叉树的性质如下:

    若他的左子树不空,则左子树上所有的结点均小于它的根结点的值。

    若他的右子树不空,则右子树上所有的结点均大于它的根结点的值。

    他的左右子树也是排序二叉树。

    深度为k的完全二叉树至少有2^(k - 1)个结点;

    最多有2^k - 1个结点。

    #include<iostream> using namespace std; struct Node { int data; Node *lchild; Node *rchild; }; Node *Tree_Insert(Node *T, int key); // 二叉排序的树的插入 Node *Create(); // 二叉树的创建 void inOrder(Node *T); // 二叉排序树的中序遍历 int Tree_Min(Node *T); // 二叉树中的最小值 int Tree_Max(Node *T); // 二叉树中的最大值 int Tree_CengNum(Node *T); // 计算二叉树的层级 void Level_Print(Node *T, int level); // 打印二叉树某一层的所有结点 int Level_Count(Node *T, int level); // 打印二叉树某一层的结点个数 bool Tree_Search(Node *T, int key); // 二叉树的搜索 void Delete(Node *T, int k); // 删除某个元素的结点 void Delete(Node *T, int k) { if(Tree_Search(T, k)) { // 查找 要删除的结点temp Node *temp = T; while(temp) { if(temp->data == k) break; else temp = (k < temp->data) ? temp->lchild : temp->rchild; } if(temp->lchild) // 若有左子树 { Node *temp1 = temp->lchild; Node *temp2 = temp1; while(temp2->rchild) // 去查找左子树中最右边的结点 { temp1 = temp2, temp2 = temp2->rchild; } // 用左子树中最右边的点覆盖要删除的点 temp->data = temp2->data; if(temp1 != temp2) // 若左子树有右结点 temp1->rchild = temp2->lchild; else // 若temp左子树没有右结点 temp->lchild = temp2->lchild; free(temp2); } else // 若无左子树 { Node *q = temp; q = q->rchild; free(q); q = NULL; } } else cout<<"没有这个数,无法删除!"; } bool Tree_Search(Node *T, int key) { Node *temp = T; int i = 1; while(temp) { if(temp->data == key) { cout<<"在第"<<i++<<endl; return true; } else { i++; temp = (key < temp->data) ? (temp->lchild) : (temp->rchild); } } return false; } void Level_Print(Node *T, int level) { if(!T)return; if(level == 1) cout<<T->data; else { Level_Print(T->lchild, level -1); Level_Print(T->rchild, level -1); } } int Level_Count(Node *T, int level) { if(T == NULL || level < 1 || level > Tree_CengNum(T)) { return 0; } if(level == 1) return 1; return Level_Count(T->lchild, level - 1) + Level_Count(T->rchild, level -1); } int Tree_CengNum(Node *T) { if(NULL==T){ return 0; }else{ int lh=Tree_CengNum(T->lchild); int rh=Tree_CengNum(T->rchild); return (lh>rh)?(lh+1):(rh+1); } } int Tree_Min(Node *T) { Node *temp = T; while(temp->lchild) { temp = temp->lchild; } return temp->data; } int Tree_Max(Node *T) { Node *temp = T; while(temp->rchild) { temp = temp->rchild; } return temp->data; } // 二叉排序的树的插入 Node *Tree_Insert(Node *T, int key) { Node *p = T; Node *temp1, *temp2; while(p != NULL) { temp1 = p; if(key == p->data) { cout<<"要插入的节点已存在,不必再插入!"<<endl; return T; } p = (key > p->data) ? p->rchild : p->lchild; } temp2 = new Node; temp2->data = key; temp2->lchild = NULL; temp2->rchild = NULL; if(T == NULL) return temp2; if(key < temp1->data) temp1->lchild = temp2; else temp1->rchild = temp2; return T; } Node *Create() { int key; Node *T = NULL; cout<<"输入节点数据值为(-1)为结束值"<<endl; cin>>key; while(key != -1) { T = Tree_Insert(T, key); cin>>key; } return T; } // 二叉排序树的中序遍历 void inOrder(Node *T) { if(T) { inOrder(T->lchild);; cout<<T->data; inOrder(T->rchild); } return; } int main() { cout<<"二叉树的构建"<<endl; Node *T = Create(); cout<<"二叉树的中序遍历"<<endl; inOrder(T); cout<<"输出该二叉树的层级"<<endl; cout<<Tree_CengNum(T)<<endl; cout<<"输入要打印的层n:"<<endl; int n; cin>>n; cout<<endl; Level_Print(T, n); cout<<"输入要查找的结点n:"; cin>>n; cout<<Tree_Search(T, n)<<endl; //打印二叉树某一层的结点个数 cout<<"输入要打印的某层n,求该层的结点个数"<<endl; cin>>n; cout<<Level_Count(T, n)<<endl; // system("pause"); return 0; }

    转载请注明原文地址: https://ju.6miu.com/read-1125192.html

    最新回复(0)