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

淄博百度网站建设百度收录接口

淄博百度网站建设,百度收录接口,家居商城网站模板,网站建设的投资必要性结点类 构造函数分为有参和无参,相同点都是初始化树高为1 class Node { public:int data; // 用于输出int val; // 数据域,用于排序int height; // 树高Node* left;Node* right;Node();Node(int v, int d);static int max(int a, int b); };Node::N…

结点类

构造函数分为有参和无参,相同点都是初始化树高为1

class Node
{
public:int data;  // 用于输出int val;   // 数据域,用于排序int height; // 树高Node* left;Node* right;Node();Node(int v, int d);static int max(int a, int b);
};Node::Node()
{data = -1;val = -1;height = 1;left = nullptr;right = nullptr;
}Node::Node(int v, int d)
{data = d;val = v;height = 1;left = nullptr;right = nullptr;
}int Node::max(int a, int b)
{return (a > b) ? a : b;
}

获取平衡因子

左子树树高减去右子树树高

int getB(Node* n)
{int leftHeight = (n->left) ? n->left->height : 0;int rightHeight = (n->right) ? n->right->height : 0;return leftHeight - rightHeight;
}

解决RR型不平衡,左旋

  • 新的根节点为当前根节点的右子树
  • 当前根结点的右子树的左子树,改变后为当前根结点的右子树(如果存在的话)
  • 当前根节点变为新的根节点的左子树
  • 最后要更新改变前后两个新旧根节点的树高,都等于1 + 左右子树的树高比较后的最大值
Node* leftRoatte(Node* n) // 左旋(RR)
{Node* newroot = n->right;Node* T2 = newroot->left;newroot->left = n;n->right = T2;// 更新树高n->height = 1 + Node::max(n->left ? n->left->height : 0, n->right ? n->right->height : 0);newroot->height = 1 + Node::max(newroot->left ? newroot->left->height : 0, newroot->right ? newroot->right->height : 0);return newroot;
}

解决LL型不平衡,右旋

实现方法与RR型大差不差

Node* rightRoatte(Node* n) // 右旋(LL)
{Node* newroot = n->left;Node* T2 = newroot->right;newroot->right = n;n->left = T2;// 更新树高n->height = 1 + Node::max(n->left ? n->left->height : 0, n->right ? n->right->height : 0);newroot->height = 1 + Node::max(newroot->left ? newroot->left->height : 0, newroot->right ? newroot->right->height : 0);return newroot;
}

结点的插入函数

  • 如果传入进来的为空结点,即当前结点无数据,则需要把传入进来的用于排序和输出的值作为参数构造一个新的结点,然后返回出去
  • 否则,则进行判断,判断当前结点的关键值与传入进来的关键值进行判断,如果传入进来的值比当前结点的值要小,则表示需要插入进当前结点的左子树,递归调用插入函数,参数是当前结点的左子树,关键值和数据域,返回后的结点赋值给当前结点的左子树
  • 如果传入进来的关键值大于当前结点的关键值,则插入右子树,方法类似
  • 如果当前结点的关键值等于传入进来的关键值,则表示这个值已经在树中存在,不需要插入,则直接将当前结点的返回出去
  • 执行完插入结点的操作后,需要更新树高,方法一样
  • 还需要更新平衡因子,因为当插入一个结点后,需要判断此时是否为平衡二叉树,根据不同结点的平衡因子进行不同的调整
  • 首先获取当前根结点的平衡因子,如果当前根节点的平衡因子大于1,且当前结点的左子树根结点大于0,即他还有左子树,则为LL型,则调用右旋函数,返回调用后的结果
  • 如果当前根节点的的平衡因子大于1,且当前根节点的左子树的根节点小于0,则其有右子树,为LR型,LR型首先要将当前结点的左子树为参数进行左旋,然后再将当前结点进行右旋,返回调用后的结果
  • 其他两种情况类似
  • 最后返回当前结点
Node* Insert(Node* now, int key, int data)
{if (now == nullptr){return new Node(key, data);}if (key < now->val){now->left = Insert(now->left, key, data);}else if (key > now->val){now->right = Insert(now->right, key, data);}else{return now;  // Key already exists, don't insert duplicate}// 更新树高now->height = 1 + Node::max(now->left ? now->left->height : 0, now->right ? now->right->height : 0);// 获取当前结点的平衡因子int balance = getB(now);if (balance > 1 && getB(now->left) >= 0) // LL{return rightRoatte(now);}else if (balance > 1 && getB(now->left) < 0) // LR{now->left = leftRoatte(now->left);return rightRoatte(now);}else if (balance < -1 && getB(now->right) <= 0) // RR{return leftRoatte(now);}else if (balance < -1 && getB(now->right) > 0) // RL{now->right = rightRoatte(now->right);return leftRoatte(now);}return now;
}
http://www.dt0577.cn/news/18681.html

相关文章:

  • 泉州做网站建设中国万网
  • 新泰网站建设宁波网站推广找哪家
  • 沧州北京网站建设产品宣传推广方式有哪些
  • 南阳建设网站招聘怎样建立自己的网站平台
  • 宝安多屏网站建设公司好吗网站优化外包费用
  • 建零售网站还是海口网站关键词优化
  • 网站建设在哪里做比较好如何做广告宣传与推广
  • 做蛋糕有哪些网站seo赚钱培训
  • 衡量网站质量的标准淄博搜索引擎优化
  • dedecms做图库网站广东公司搜索seo哪家强
  • 深圳市创想三维科技有限公司山东搜索引擎优化
  • 建网站的要求社交网络推广方法
  • 网站加qq客服产品的推广及宣传思路
  • wordpress怎样显示子类目临沧seo
  • 做ic销售的各种网站seo排名点击
  • 做旅游网站会遇到什么问题百度推广登录平台客服
  • 一级域名网站搜狗官网
  • 论坛网站免费建设模板下载安装营销策划公司名称
  • 什么摄像头做直播网站代运营公司怎么找客户
  • 做独立网站需要注意什么手续网站的seo方案
  • 网站建设 推广 公司西安网站推广
  • 成都有没有做网站建设的最好的seo外包
  • 网站备案信息如何注销吗郑州最新通告
  • 河南省住房和城乡建设厅网站营销网站建设规划
  • 杭州网站模板国内网站排名
  • 山西省和城乡建设厅网站百度网盘破解版
  • 克隆网站首页做单页站几个文件广告传媒公司
  • 网站建设公众号开培训心得体会总结简短
  • 如何进行网站建设分析seo优化专家
  • 做的比较好的返利网站知乎太原做网站的工作室