当前位置: 首页 > news >正文

平衡二叉树最全代码

#include<stdio.h>
#include<stdlib.h>typedef struct Node
{int val;int height;struct Node *left;struct Node *right;
}Node;//创建新结点
Node* newNode(int val)
{Node *node = (Node*)malloc(sizeof(Node));node->val = val;node->height = 1;node->left = node->right = NULL;return node;
}//获取结点高度
int getHeight(Node *node)
{return node ? node->height : 0;
}int max(int a,int b)
{return a>b?a:b;
}//左旋操作
Node* leftRotate(Node* root)
{Node *newRoot = root->right;Node *T2 = newRoot->left;newRoot->left = root;root->right = T2;root->height = max(getHeight(root->left),getHeight(root->right)) + 1;newRoot->height = max(getHeight(newRoot->left),getHeight(newRoot->right)) + 1;return newRoot;
}//右旋操作
Node* rightRotate(Node* root)
{Node *newRoot = root->left;Node *T2 = newRoot->right;newRoot->right = root;root->height = max(getHeight(root->left),getHeight(root->right)) + 1;root->height = max(getHeight(newRoot->left),getHeight(newRoot->right)) + 1;return newRoot;
}//获取平衡因子(BF)
int getBalance(Node *node)
{return getHeight(node->left) - getHeight(node->right);
}//插入结点
Node* insert(Node* node,int key)
{if(!node)return newNode(key);if(key < node->val)node->left = insert(node->left,key);else if(key > node->val)node->right = insert(node->right,key);else return node;node->height = 1 + max(getHeight(node->left),getHeight(node->right));int balance = getBalance(node);// 左左情况if(balance > 1 && getBalance(node->left) > 0)return rightRotate(node);//右右情况if(balance < -1 && getBalance(node->right) < 0)return leftRotate(node);//左右情况	if(balance > 1 && getBalance(node->left) < 0){node->left = leftRotate(node->left);return rightRotate(node);}//右左情况if(balance < -1 && getBalance(node->right) > 0)  {node->right =  rightRotate(node->right);return  leftRotate(node);}return node;
}//删除结点
Node* deleteNode(Node* root,int key)
{if(!root)return root;if(key<root->val)root->left = deleteNode(root->left,key);else if(key>root->val)root->right = deleteNode(root->right,key);else{if(root->left == NULL || root->right == NULL){Node *temp = root->left ? root->left : root->right;if(temp == NULL){temp = root;root = NULL;}else{*root =  *temp;}free(temp);}else{Node *temp = root->right;while(temp && temp->left != NULL)temp = temp->left;root->val = temp->val;root->right = deleteNode(root->right,temp->val);}}if(root == NULL)return root;root->height = 1 + max(getHeight(root->left),getHeight(root->right));int balance =getBalance(root);if(balance > 1 && getBalance(root->left) >= 0)return rightRotate(root);if(balance > 1 && getBalance(root->left) < 0){root->left = leftRotate(root->left);return rightRotate(root);}if(balance < -1 && getBalance(root->right) <= 0)return leftRotate(root);if(balance < -1 && getBalance(root->right) > 0){root->right = rightRotate(root->right);return leftRotate(root);}return root;
}
// 修改节点值
Node* modifyNode(Node* root, int oldVal, int newVal) {// 先删除节点root = deleteNode(root, oldVal);// 然后插入新的值root = insert(root, newVal);return root;  // 返回修改后的树的根
}
void preOrder(Node *root)
{if(root){printf("%d ",root->val);preOrder(root->left);preOrder(root->right);}
}void inOrder(Node *root)
{if(root){inOrder(root->left);printf("%d ",root->val);inOrder(root->right);}
}Node *find(Node *root,int key)
{if(root == NULL || root->val)return root;if(key < root->val)return find(root->left,key);elsereturn find(root->right,key);
}void test()
{// 插入节点Node *root = NULL;root = insert(root, 10);root = insert(root, 20);root = insert(root, 30);root = insert(root, 40);root = insert(root, 50);root = insert(root, 60);root = insert(root, 70);root = insert(root, 80);printf("-----先序遍历-----\n");preOrder(root);printf("\n");printf("-----中序遍历-----\n");inOrder(root);printf("\n");// 修改节点printf("修改节点 30 为 35:\n");root = modifyNode(root, 30, 35);printf("-----先序遍历-----\n");preOrder(root);printf("\n");printf("删除节点35:\n");root = deleteNode(root, 35);preOrder(root);printf("\n");}int main()
{test();return 0;
}
http://www.lryc.cn/news/466313.html

相关文章:

  • 数据库表的创建
  • 【MySQL 数据库】之--基础知识
  • Flume面试整理-如何处理Flume中的数据丢失
  • 文件处理新纪元:微信小程序的‘快递员’与‘整理师’
  • 应付账款优化,自动化管理5要点
  • Win安装Redis
  • 手把手带你安装U9【win10+sql+U9】,同样适用U9C的安装
  • 若依前后端框架学习——新建模块(图文详解)
  • 【LaTeX和Word版】写论文时如何调整公式和文字的间距
  • 快乐数--双指针
  • 论文阅读-三维结构几何修复(导-4)
  • 数字货币交易所源码开发:场外(OTC)与币币交易所系统的构建指南
  • C++ 进阶:类相关特性的深入探讨
  • C++ 多态、虚析构、模板类、常函数、虚继承、虚函数和纯虚函数相关知识和问题总结
  • 计算机组成原理一句话
  • 【Linux】僵尸进程和孤儿进程
  • Patchcore运行过程
  • 一小时快速入门Android GPU Inspector
  • 二叉树展开为链表
  • 基于SpringBoot+Vue+uniapp微信小程序的教学质量评价系统的详细设计和实现
  • 【二刷hot100】day 4
  • 10.22学习
  • 【不要离开你的舒适圈】:猛兽才希望你落单,亲人总让你回家,4个维度全面构建舒适圈矩阵
  • OpenIPC开源FPV之Channel配置
  • UG NX12.0建模入门笔记:1.0 UG NX12.0安装教程
  • 【C++】踏上C++学习之旅(三):“我“ 与 “引用“ 的浪漫邂逅
  • 中间件之Seata
  • MySQL 异常: “Host ‘xxx‘ is not allowed to connect to this MySQL server“
  • c语言中字符串函数strlen,strcmp,strcpy,srtcat,strncpy,strncat,strncmp
  • 携程线下一面,面试内容: