简单二叉树
来源:互联网 发布:淘宝流量钱包兑换 编辑:程序博客网 时间:2024/06/05 11:17
以下实现了二叉树的一些方法
#include <iostream>#include <string>#include <queue>#include <stack>using namespace std;class BiTreeNode{public: char data; int weight; int high; BiTreeNode* lchild; BiTreeNode* rchild; BiTreeNode() : lchild(NULL), rchild(NULL), weight(0), high(0){} BiTreeNode(char num) : data(num), lchild(NULL), rchild(NULL), weight(0), high(0){}};class BiTree{public: BiTreeNode* Root; queue<char> parent; queue<char> child; BiTree(){ leavenum = 0; } void CreateTree(string TreeArray){ pos = 0; strTree.assign(TreeArray); Root = CreateBiTree(); } void CreateTree2(string TreeArray, int* w){ pos = 0; index = 0; weight = w; strTree.assign(TreeArray); Root = CreateBiTree2(); } void PreOrder(BiTreeNode* T){ if(T){ cout<<T->data; PreOrder(T->lchild); PreOrder(T->rchild); } } void PreOrder2(int i, int n, int num[]){ if(i < n && num[i] != 0){ cout<<num[i]<<" "; PreOrder2(2*i+1, n, num); PreOrder2(2*i+2, n, num); } } void InOrder(BiTreeNode* T){ if(T){ InOrder(T->lchild); cout<<T->data; InOrder(T->rchild); } } void PostOrder(BiTreeNode* T){ if(T){ PostOrder(T->lchild); PostOrder(T->rchild); cout<<T->data; } } void leaveNum(BiTreeNode* T){ if(T->lchild = NULL && T->rchild == NULL){ leavenum++; } if(T->lchild){ leaveNum(T->lchild); } if(T->rchild){ leaveNum(T->rchild); } } int TreeDepth(BiTreeNode* T){ if(!T) return 0; int left = 1, right = 1; left += TreeDepth(T->lchild); right += TreeDepth(T->rchild); return left > right ? left : right; } int height(BiTreeNode* T){ if(!T) return 0; return max(height(T->lchild), height(T->rchild)) + 1; } void LevelOrder(BiTreeNode* T){ queue<BiTreeNode*> tq; BiTreeNode* p = T; if(p){ tq.push(p); } while(!tq.empty()){ p = tq.front(); cout<<p->data; tq.pop(); if(p->lchild){ tq.push(p->lchild); } if(p->rchild){ tq.push(p->rchild); } } } void findNode(){ findNode(Root); while(!child.empty()){ cout<<child.front()<<" "; child.pop(); } cout<<endl; while(!parent.empty()){ cout<<parent.front()<<" "; parent.pop(); } cout<<endl; } void FindTimes(int value){ int r = 0; cout<<findTimes(value, Root, r)<<endl; } void BuildTree(int n, int* num){ for(int i = 0; i < n; ++i){ insert(num[i], Root, false); } } //二叉查找树之删除 void del(int value, BiTreeNode* &T){ if(T){ if(value == T->data){ if(T->lchild && T->rchild){ BiTreeNode* p = T->rchild; while(p->lchild){ p = p->lchild; } T->data = p->data; del(p->data, T->rchild); }else{ BiTreeNode* p = T; if(!T->lchild){ T = T->rchild; }else if(!T->rchild){ T = T->lchild; } delete p; } }else if(value < T->data){ del(value, T->lchild); }else{ del(value, T->rchild); } } } //二叉树之带权路径和 void traverse(BiTreeNode* T){ if(T){ if(T->lchild){ T->lchild->high = T->high + 1; traverse(T->lchild); } if(T->rchild){ T->rchild->high = T->high + 1; traverse(T->rchild); } } } int findMaxPath(BiTreeNode* T){ if(!T) return 0; return max(findMaxPath(T->lchild), findMaxPath(T->rchild)) + T->weight; } int WeightSum(BiTreeNode* T){ if(!T) return 0; return WeightSum(T->lchild) + WeightSum(T->rchild) + T->weight*T->high; } //先序和中序遍历创建树 BiTreeNode* CreateBiTree(string pre, string mid){ BiTreeNode* T = new BiTreeNode(); T->data = pre[0]; int ltreelen = mid.find(pre[0]); if(pre.length() == 1){ T->lchild = NULL; T->rchild = NULL; }else{ if(ltreelen > 0){ T->lchild = CreateBiTree(pre.substr(1, ltreelen), mid.substr(0, ltreelen)); }else{ T->lchild = NULL; } if(ltreelen < mid.length()-1){ T->rchild = CreateBiTree(pre.substr(ltreelen+1, pre.find('\0')), mid.substr(ltreelen+1, mid.find('\0'))); }else{ T->rchild = NULL; } } Root = T; return T; } //后序遍历非递归算法 void notRecursionOrder(){ BiTreeNode* T = Root; stack<BiTreeNode*> s1; stack<int> s2; if(!T) return; BiTreeNode* p = T; do{ if(p){ s1.push(p); s2.push(0); p = p->lchild; }else{ int tag = s2.top(); if(!tag){ s2.pop(); s2.push(1); p = s1.top()->rchild; }else{ p = s1.top(); s1.pop(); s2.pop(); cout<<p->data; p = NULL; } } }while(!s1.empty()); cout<<endl; }private: int pos, depth, index, leavenum; int* weight; string strTree; BiTreeNode* CreateBiTree(){ BiTreeNode* T; char ch; ch = strTree[pos++]; if(ch == '0'){ T = NULL; }else{ T = new BiTreeNode(); T->data = ch; T->lchild = CreateBiTree(); T->rchild = CreateBiTree(); } return T; } BiTreeNode* CreateBiTree2(){ BiTreeNode* T; char ch; ch = strTree[pos++]; if(ch == '0'){ T = NULL; }else{ T = new BiTreeNode(); T->data = ch; if(ch >= 'A' && ch <= 'Z'){ T->weight = weight[index++]; } T->lchild = CreateBiTree2(); T->rchild = CreateBiTree2(); } return T; } int findNode(BiTreeNode* T){ if(T->lchild == NULL && T->rchild == NULL){ return 0; } if(T->lchild && findNode(T->lchild) == 0){ child.push(T->lchild->data); parent.push(T->data); } if(T->rchild && findNode(T->rchild) == 0){ child.push(T->rchild->data); parent.push(T->data); } return 1; } int findTimes(int value, BiTreeNode* T, int& result){ if(!T){ result = -1; }else{ ++result; if(value < T->data){ findTimes(value, T->lchild, result); }else if(value > T->data){ findTimes(value, T->rchild, result); }else { return result; } } } void insert(int value, BiTreeNode* &T, bool flag){ if(T){ if(value < T->data){ insert(value, T->lchild, flag); }else{ insert(value, T->rchild, flag); } }else{ T = new BiTreeNode(value); if(flag){ InOrder(Root); cout<<endl; } } }};struct HuffNode{ char elem; int weight; int parent; int lchild; int rchild;};class HuffMan{public: int len; int lnum; HuffNode* huffTree; string* huffCode; void MakeTree(int n, int wt[]){ int i; lnum = n; len = 2*n -1; huffTree = new HuffNode[2*n]; huffCode = new string[n+1]; for(i = 1; i <= n; ++i){ huffTree[i].weight = wt[i-1]; } for(i = 1; i <= len; ++i){ if(i > n){ huffTree[i].weight = 0; } huffTree[i].parent = 0; huffTree[i].lchild = 0; huffTree[i].rchild = 0; } MakeTree(); } void Coding(){ char* cd; int i, j, c, f, start; cd = new char[lnum + 1]; cd[lnum - 1] = '\0'; for(i = 1; i <= lnum; ++i){ start = lnum - 1; for(c = i, f = huffTree[i].parent; f != 0; c = f, f = huffTree[f].parent){ if(huffTree[f].lchild == c){ cd[--start] = '0'; }else{ cd[--start] = '1'; } }huffCode[i].assign(&cd[start]); } delete []cd; } int Decode(const string codestr, char txtstr[]){ char ch; int i, k = 0, c = len; for(i = 0; i < codestr.length(); ++i){ ch = codestr[i]; if(ch == '0'){ c = huffTree[c].lchild; }else if(ch == '1'){ c = huffTree[c].rchild; }else{ return 0; } if(huffTree[c].lchild == 0 && huffTree[c].rchild == 0){ txtstr[k] = huffTree[c].elem; ++k; c = len; }else{ ch = '\0'; } } if(ch == '\0') return 0; else txtstr[k] = '\0'; return 1; } void Destroy(){ len = 0; lnum = 0; delete []huffTree; delete []huffCode; }private: void MakeTree(){ int i, s1, s2; for(i = lnum+1; i <= len; ++i){ SelectMin(i-1, &s1, &s2); huffTree[s1].parent = i; huffTree[s2].parent = i; huffTree[i].lchild = s1; huffTree[i].rchild = s2; huffTree[i].weight = huffTree[s1].weight + huffTree[s2].weight; } } void SelectMin(int pos, int* s1, int* s2){ int w1, w2, i; w1 = w2 = 0x7fffffff; *s1 = *s2 = 0; for(i = 1; i <= pos; ++i){ if(huffTree[i].weight < w1 && huffTree[i].parent == 0){ w2 = w1; *s2 = *s1; w1 = huffTree[i].weight; *s1 = i; }else if(huffTree[i].weight < w2 && huffTree[i].parent == 0){ w2 = huffTree[i].weight; *s2 = i; } } }};//AVL树typedef struct AVLNode{ ElemType Element; AVLTree Left; AVLTree Right; int Height;}AVLNode,*AVLTree,*Position;AVLTree MakeEmpty(AVLTree T){ if(T != NULL){ MakeEmpty(T->Left); MakeEmpty(T->Right); free(T); } return NULL;}Position Find(ElemType x,AVLTree T){ if(T == NULL) return NULL; if(x < T->Element) return Find(x,T->Left); else if(x > T->Element) return Find(x,T->Right); else return T;}Position FindMin (AVLTree T){ if(T == NULL) return NULL; while(T->Left) T = T->Left; return T;}Position FindMax(AVLTree T){ if (T == NULL) return NULL; while (T->Right) T = T->Right; return T;}static int Height(Position P){ if(P == NULL) return -1; return P->Height;}static int Max(int Lhs,int Rhs){ return Lhs > Rhs ? Lhs : Rhs;}static Position SingleRotateWithLeft(Position K2){ Position K1; K1 = K2->Left; K2->Left = K1->Right; K1->Right = K2; K2->Height = Max(Height(K2->Left),Height(K2->Right)) + 1; K1->Height = Max(Height(K1->Left),Height(K1->Right)) + 1; return K1;}static Position SingleRotateWithRight(Position K2){ Position K1; K1 = K2->Right; K2->Right = K1->Left; K1->Left = K2; K1->Height = Max(Height(K1->Left), Height(K1->Right)) + 1; K2->Height = Max(Height(K2->Left), Height(K2->Right)) + 1; return K1;}static Position DoubleRotateWithLeft(Position K3){ K3->Left = SingleRotateWithRight(K3->Left); return SingleRotateWithLeft(K3);}static Position DoubleRotateWithRight(Position K3){ K3->Right = SingleRotateWithLeft(K3->Right); return SingleRotateWithRight(K3);}AVLTree Insert(ElemType x,AVLTree T){ if(!T){ T = (AVLTree)malloc(sizeof(AVLNode)); if(!T) exit(-1); T->Element = x; T->Height = 0; T->Left = T->Right = NULL; } else if(x < T->Element){ T->Left = Insert(x,T->Left); if(Height(T->Left) - Height(T->Right) == 2){ if(x < T->Left->Element) T = SingleRotateWithLeft(T); else T = DoubleRotateWithLeft(T); } } else if(x > T->Element){ T->Right = Insert(x,T->Right); if(Height(T->Right) - Height(T->Left) == 2){ if(x < T->Right->Element) T = SingleRotateWithRight(T); else T = DoubleRotateWithRight(T); } } T->Height = Max(Height(T->Left),Height(T->Right)) + 1; return T;}int main(){ int t; cin>>t; while(t--){ string str; cin>>str; BiTree bt; bt.CreateTree(str); //... } return 0;}
0 0
- 简单二叉树实现
- 二叉树简单说明
- 二叉树简单操作
- 二叉树简单模拟
- 简单二叉树遍历
- 简单二叉树创建
- 简单二叉树
- 二叉树简单知识点
- 二叉树简单汇总
- 简单二叉树操作
- 简单的二叉树
- 简单实现二叉树
- 简单二叉树
- 二叉树简单介绍
- 简单二叉树
- 二叉树简单应用
- 简单二叉树实现
- 二叉树简单实现
- 面向对象(一)
- 石子合并 最大值
- 强制类型转换注意问题
- 1.3 网络基础TCP/IP
- 计算机视觉与深度学习公司
- 简单二叉树
- Simulink基础:直流电动机建模
- Tv App Develop of TvServer Service
- 开始我的程序员之路,keep it simple,keep it stupid.
- [004-Makefile-笔记] Makefile规则的命令
- uboot boot kernel
- 深入理解Java:注解(Annotation)自定义注解入门
- Coding创建项目
- 保守式GC