平衡二叉树的的插入
来源:互联网 发布:base.apk软件下载 编辑:程序博客网 时间:2024/05/16 15:39
平衡二叉树的建立:
#include <iostream>#include <vector>#include <map>using namespace std; struct TreeNode { int val; int bf; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x),bf(0), left(NULL), right(NULL) {} }; class Solution {public: TreeNode *sortedArrayToBST(vector<int> &num) { TreeNode *root = NULL;for(size_t i=0;i<num.size();++i){root = createTree(root,num[i]);}printBST(root,2);return root; } private: void printBST(TreeNode *root,int space){ if(root){ cout<<root->val<<endl; if(root->left){ for(int i=0;i<space;++i) cout<<" "; } printBST(root->left,space+2); if(root->right) { for(int i=0;i<space;++i) cout<<" "; } printBST(root->right,space+2); } } TreeNode *createNode(int val){ TreeNode *node = new TreeNode(val); return node; } TreeNode *createTree(TreeNode *root,int val){ TreeNode *node = createNode(val); TreeNode *p = root; if(NULL==root) { root = node; return root; } TreeNode *a=root,*fa=NULL;//a表示距离插入位置最近,且平衡因子不为0的结点,fa表示a的父节点 TreeNode *pre=NULL;//pre表示插入结点的前驱结点 while(p){//找到插入结点 if(p->bf){ fa=pre; a=p; } pre = p; if(node->val >= p->val){//右转 p=p->right; }else{ p=p->left; } } if(node->val < pre->val){//插入结点 pre->left = node; }else{ pre->right = node; } p=a; while(p!=node){ if(node->val < p->val){ p->bf+=1; p=p->left; }else{ p->bf-=1; p=p->right; } } if(a->bf==2 || a->bf==-2){ if(a->bf==2 && a->left->bf==1){//LL型,结点插入不平衡结点的左子结点的左子树 p=LL_Rotate(a); }else if(a->bf==2 && a->left->bf==-1){//LR型,结点插入不平衡结点的左子结点的右子树 p=LR_Rotate(a); }else if(a->bf==-2 && a->right->bf==-1){//RR型,结点插入不平衡结点的右子结点的右子树 p=RR_Rotate(a); }else if(a->bf==-2 && a->right->bf==1){//RL型,结点插入不平衡结点的右子结点的左子树 p=RL_Rotate(a); } if(fa){ if(node->val < fa->val){ fa->left = p; }else{ fa->right = p; } }else{ root = p; } } return root; }private: TreeNode* LL_Rotate(TreeNode *a){ TreeNode *ca=a->left; a->left=ca->right; ca->right=a; a->bf=0; ca->bf=0; return ca; } TreeNode* LR_Rotate(TreeNode *a){ TreeNode *ca=a->left,*c=ca->right; ca->right = c->left; a->left = c->right; c->left = ca; c->right = a; switch(c->bf){ case 1:ca->bf=0;a->bf=-1;break;//插入结点位于c的左子树 case 0:ca->bf=0;a->bf=0;break;//c是插入结点 case -1:ca->bf=1;a->bf=0;break;//插入结点位于c的右子树 } c->bf=0; return c; } TreeNode* RR_Rotate(TreeNode *a){ TreeNode *ca = a->right; a->right = ca->left; ca->left = a; ca->bf=0; a->bf=0; return ca; } TreeNode* RL_Rotate(TreeNode *a){ TreeNode *ca=a->right,*c=ca->left; ca->left = c->right; a->right = c->left; c->left = a; c->right = ca; switch(c->bf){ case 1:ca->bf=-1;a->bf=0;break;//插入结点位于c的左子树 case 0:ca->bf=0;a->bf=0;break;//c是插入结点 case -1:ca->bf=0;a->bf=1;break;//插入结点位于c的右子树 } c->bf=0; return c; }};int main(){Solution s;int a[]={1,2,3,4,5,6,7,8,9};vector<int> v(a,a+9);s.sortedArrayToBST(v);return 0;}
0 0
- 平衡二叉树的的插入
- 平衡二叉树插入的实现
- 平衡二叉树的插入、删除
- 平衡二叉树的插入实现
- 平衡二叉树的插入旋转
- 平衡二叉树的插入和旋转
- 【基础算法】:平衡二叉树的插入
- 数据结构--平衡二叉树的插入详解
- 平衡二叉树的插入C语言
- 平衡二叉树(AVL)的插入操作
- 平衡二叉树的插入旋转
- 二叉平衡树 插入
- 平衡二叉树(AVL)的插入和删除详解(上)
- 平衡二叉树(AVL)的插入和删除详解(下)
- 平衡二叉树插入某个节点的方法
- 网络子系统40_inet_peer平衡二叉树的插入
- 平衡二叉树的插入(删除)操作
- 平衡二叉树AVL的基本操作之插入
- 如何在XSLT样式表中声明命名空间
- java中override和java编译器compiler版本的问题
- Spring的SimpleUrlHandlerMapping实例(有三种配法)
- UVA10303 - How Many Trees?(java大数+catalan数)
- hdu-1253
- 平衡二叉树的的插入
- 如何解决“Error detected while processing /root/.vimrc:”
- 神器 VisuAlgo:通过动画学习算法和数据结构
- Unable to execute dex: java.nio.BufferOverflowException.解决办法
- Java学习计划 目标java大神 英语大神 日语大神 游戏大神 动漫大神 说话大神 男神大神
- CF 412 D Giving Awards(拓扑排序)
- unity学习之多态和索引器
- 开发者必备的SQL性能优化基本功
- Mysql 的explain