3374-数据结构实验之查找二:平衡二叉树
来源:互联网 发布:李剑模糊阅读知乎 编辑:程序博客网 时间:2024/06/07 23:24
#include <bits/stdc++.h>#define ElemType intusing namespace std;typedef struct AVLTree{ ElemType data; ElemType bal; /// 记录平衡因子 struct AVLTree *Left; struct AVLTree *Right;}Node;int GetBal(Node *p); /// 求节点平衡因子Node *LL(Node *p); /// 右旋Node *RR(Node *p); /// 左旋Node *LR(Node *p); /// 先右旋再左旋Node *RL(Node *p); /// 先左旋再右旋Node *AVLCreat(Node *root, ElemType x);void InTraversal(Node *root);int main(){ int n; while(cin >> n) { Node *root = NULL; /// 初始化很重要! for(int i = 0; i < n; i++) { int x; cin >> x; root = AVLCreat(root, x); } cout << root->data << endl; //InTraversal(root); } return 0;}int GetBal(Node *p){ if(!p) { return -1; } else { return p->bal; }}Node *LL(Node *root) /// 对于LL型 直接在不平衡的节点右旋{ Node *p; /// 画图便于理解 p = root->Left; root->Left = p->Right; p->Right = root; p->bal = max(GetBal(p->Left), GetBal(p->Right)) + 1; /// get平衡因子 root->bal = max(GetBal(root->Left), GetBal(root->Right)) + 1; /// 因为此时节点位置改变 所以重新计算此时节点的平衡因子 return p; /// 此时p为新的子树根节点}Node *RR(Node *root) /// 同上QvQ{ Node *p; p = root->Right; root->Right = p->Left; p->Left = root; p->bal = max(GetBal(p->Left), GetBal(p->Right)) + 1; /// get平衡因子 root->bal = max(GetBal(root->Left), GetBal(root->Right)) + 1; /// 因为此时节点位置改变 所以重新计算此时节点的平衡因子 return p; /// 此时p为新的子树根节点}Node *LR(Node *p) /// 对于LR型 先对失衡节点的左子树进行左旋 再对整个子树右旋{ p->Left = RR(p->Left); /// 为什么感觉自己不分左右了2333 return LL(p); /// 我真的不分左右了!!!!!!}/// 理解没错 博客有毒Node *RL(Node *p) /// 对于RL型 先对失衡节点的右子树进行右旋 再对整个子树左旋{ p->Right = LL(p->Right); return RR(p);}Node *AVLCreat(Node *root, ElemType x){ if(!root) { root = new Node; root->data = x; root->bal = -1; root->Left = NULL; root->Right = NULL; } else { if(x < root->data) { root->Left = AVLCreat(root->Left, x); if(GetBal(root->Left) - GetBal(root->Right) > 1) /// 进入左子树后 只会出现LL或是LR型 { if(root->Left->data > x) ///则进入左节点的左子树 为LL型 { root = LL(root); } else { root = LR(root); } } } else { root->Right = AVLCreat(root->Right, x); if(GetBal(root->Right) - GetBal(root->Left) > 1) { if(root->Right->data < x) { root = RR(root); } else { root = RL(root); } } } } root->bal = max(GetBal(root->Left), GetBal(root->Right)) + 1; return root;}void InTraversal(Node *root){ if(root) { InTraversal(root->Left); cout << root->data << " "; InTraversal(root->Right); }}
阅读全文
0 0
- 数据结构实验之查找二:平衡二叉树【OJ--3374】
- SDUT 3374 数据结构实验之查找二:平衡二叉树
- 3374 数据结构实验之查找二:平衡二叉树
- 3374-数据结构实验之查找二:平衡二叉树
- 3374 数据结构实验之查找二:平衡二叉树
- SDUT 3374 数据结构实验之查找二:平衡二叉树
- 数据结构实验之查找二:平衡二叉树
- 数据结构实验之查找二:平衡二叉树
- 数据结构实验之查找二:平衡二叉树
- SDUT 数据结构实验之查找二:平衡二叉树
- 数据结构实验之查找二:平衡二叉树
- 数据结构实验之查找二:平衡二叉树
- 数据结构实验之查找二:平衡二叉树
- 数据结构实验之查找二:平衡二叉树
- 数据结构实验之查找二:平衡二叉树
- SDUT3374数据结构实验之查找二:平衡二叉树
- 数据结构实验之查找二:平衡二叉树
- 数据结构实验之查找二:平衡二叉树
- 3373-数据结构实验之查找一:二叉排序树
- 【剑指offer】面试题39 数组中出现次数超过一半的数字
- GC面试心得
- JDK8较JDK7部分新特性
- windows下git使用
- 3374-数据结构实验之查找二:平衡二叉树
- Servlet.service() for servlet [springServlet] in context with path [/TESTVIDEO] threw exception [Req
- 使用poco库搭建简单http服务器实现hello world
- 3375-数据结构实验之查找三:树的种类统计
- 一致性哈希算法
- Java中的锁分类
- 3642-判断给定森林中有多少棵树特别版
- 神经网络算法是数据拟合算法
- 神经网络实现手写字符识别系统