树的代码
- 格式:doc
- 大小:50.50 KB
- 文档页数:11
C++实现AVL树的完整代码AVL树的介绍AVL树是⼀种⾃平衡的⼆叉搜索树,它通过单旋转(single rotate)和双旋转(double rotate)的⽅式实现了根节点的左⼦树与右⼦树的⾼度差不超过1,。
这有效的降低了⼆叉搜索树的时间复杂度,为O(log n)。
那么,下⾯⼩编将详细介绍C++实现AVL 树的代码。
最后⼀步提供可靠的代码实现这⾥先粘贴代码给⼤家的忠告,⼀定要及时去实现,不然之后再实现要花更多的时间/**平衡⼆叉树应该有些功能*插⼊删除查找*前序遍历中序遍历后序遍历层次遍历*统计结点数⽬*///代码已经调好,写了很久才写出来#ifndef _AVLTREE_#define _AVLTREE_#include<iostream>#include<vector>#include<queue>#include<map>using namespace std;#define MAXFACTOR = 2;template<class Key , class E>class AVLNode{private:Key key;E value;AVLNode<Key,E>* left;AVLNode<Key,E>* right;AVLNode<Key,E>* parent;public:AVLNode():left(nullptr),right(nullptr),parent(nullptr){}AVLNode(Key _key,E _value , AVLNode<Key,E>* _parent = nullptr,AVLNode<Key,E>*_left = nullptr, AVLNode<Key,E>*_right = nullptr):key(_key),value(_value),left(_left),right(_right),parent(_parent){}bool isLeaf(){return left==nullptr && right == nullptr ;}//元素设置Key getKey() const { return key;}void setKey(Key set) {key = set;}E getValue() const { return value;}void setValue(E set) {value = set;}AVLNode<Key,E>* getLeft() { return left; }void setLeft (AVLNode< Key,E >* set){ left = set;}AVLNode<Key,E>* getRight() { return right;}void setRight (AVLNode<Key,E>* set) {right = set ;}AVLNode<Key,E>* getParent() {return parent;}void setParent(AVLNode<Key,E>* set) { parent = set;}};template<class Key , class E>class AVLTree{private:AVLNode<Key,E>* root;void clear(AVLNode<Key,E>* &r){if(r==nullptr)return;delete r;}void Init(){root = new AVLNode<Key,E>();root=nullptr;}void preOrder(AVLNode<Key,E>* r,void(*visit) (AVLNode<Key,E> * node)) {if(r==nullptr)return;(*visit) (r);preOrder(r->getLeft() , visit);preOrder(r->getRight(), visit);}void inOrder(AVLNode<Key,E>* r , void(*visit)(AVLNode<Key,E>* node) ) {if(r==nullptr)return;inOrder(r->getLeft() , visit);(*visit)(r);inOrder(r->getRight(),visit);}void postOrder(AVLNode<Key,E>*r , void (*visit) (AVLNode<Key,E>* node)) {if(r==nullptr)return;postOrder(r->getLeft(),visit);postOrder(r->getRight(),visit);(*visit)(r);}void levelOrder(AVLNode<Key,E>*r , void (*visit) (AVLNode<Key,E>* node)) {queue< AVLNode<Key,E>* > q;if(r==nullptr)return;q.push(r);while( ! q.empty() ){AVLNode<Key,E>* tmp = q.front();q.pop();(*visit)(tmp);if(tmp->getLeft() ) q.push(tmp->getLeft() );if(tmp->getRight()) q.push(tmp->getRight());}}AVLNode<Key,E>* find(AVLNode<Key,E>* r,Key k){if(r==nullptr)return nullptr;if(k == r->getKey() ) return r;else if( k < r->getKey()){find(r->getLeft(),k);}else {find(r->getRight(),k);}}//Find the smallest element in the avl treeAVLNode<Key,E>* getMin(AVLNode<Key,E>* r){if(r->getLeft() == nullptr) return r;else{getMin(r->getLeft());}}//Remove the smallest elementAVLNode<Key,E>* deleteMin(AVLNode<Key,E>* rt){if(rt->getLeft() == nullptr) return rt->getRight();else{rt->setLeft(deleteMin(rt->getLeft()));}AVLNode<Key,E>* leftRotate(AVLNode<Key,E>* node){if( node == nullptr) return nullptr;AVLNode<Key,E>* newHead = node->getRight();node->setRight( newHead -> getLeft() );newHead -> setLeft( node );return newHead;}AVLNode<Key,E>* rightRotate(AVLNode<Key,E>* node){if(node == nullptr)return nullptr;AVLNode<Key,E>* newHead = node->getLeft();node->setLeft( newHead->getRight() );newHead ->setRight(node);return newHead;}int getHeight(AVLNode<Key,E>*node){if(node == nullptr)return 0;if(node->isLeaf())return 1;else return ( getHeight( node->getLeft() ) > getHeight( node->getRight() ) ? getHeight( node->getLeft() ) : getHeight( node->getRight() ) ) + 1; }int getBalanceFactor(AVLNode<Key,E>* node){return getHeight(node->getLeft()) - getHeight(node->getRight() );}AVLNode<Key,E>* balance(AVLNode<Key,E>* node){if(!node) return nullptr;else if ( getBalanceFactor( node ) == 2){if(getBalanceFactor( node ->getLeft() ) == 1){node = rightRotate(node);}else{node->setLeft(leftRotate( node->getLeft() ) );node = rightRotate(node);}}else if(getBalanceFactor( node ) == -2){if(getBalanceFactor( node->getRight()) == -1){node = leftRotate(node);}else{node->setRight( rightRotate( node->getRight() ) );node = leftRotate(node);}}return node;}AVLNode<Key,E>* insert( AVLNode<Key,E>* root ,const pair<Key,E>& it) {if(root == nullptr){return new AVLNode<Key,E>(it.first , it.second,NULL,NULL,NULL);}else if (it.first < root->getKey() ){root ->setLeft( insert(root->getLeft() , it) ) ;}else{root ->setRight( insert(root->getRight() , it) );root = balance(root);return root;}AVLNode<Key,E>* remove(AVLNode<Key,E>* node , const Key k){if(node == nullptr) return nullptr;if(node->getKey() > k){node->setLeft( remove(node->getLeft() , k) );node = balance(node);}else if(node->getKey() < k){node->setRight( remove(node->getRight(), k) );node = balance(node);}else if(node->getKey() == k){if(! node->isLeaf() ){AVLNode<Key,E>* tmp = getMin(node->getRight() );node->setKey( tmp->getKey() );node->setValue( tmp->getValue() );node->setRight( deleteMin(node->getRight() ) );delete tmp;}else {AVLNode<Key,E>* tmp = node;node = (node->getLeft() != nullptr) ? node->getLeft() : node->getRight() ; delete tmp;}}return node;}public:~AVLTree(){clear(root);}AVLTree(){/*Init();*/ root = nullptr; }//四种遍历⽅式void preOrder( void (*visit)(AVLNode<Key,E>* r)){preOrder(root,visit);}void inOrder(void (*visit)(AVLNode<Key,E>* r)){inOrder(root,visit);}void postOrder(void (*visit)(AVLNode<Key,E>* r)){postOrder(root,visit);}void levelOrder( void(*visit)(AVLNode<Key,E>*r) ){levelOrder(root,visit);}//插⼊void insert(const pair<Key,E> &it){root = insert(root,it);}//删除void remove(const Key& k){remove(root,k);}bool find(const Key&k){return find(root,k);}};#endif//AVLtest.cpp#include"NewAvl.h"#include<iostream>using namespace std;template<typename Key,typename E>void traverse(AVLNode<Key,E>* root){cout<<root->getKey()<<" "<<root->getValue()<<" "; cout<<endl;}int main(){AVLTree<int,int>* tree = new AVLTree<int ,int>; for(int i = 0 ; i < 5 ; i ++){tree->insert(make_pair(i,i));}tree->remove(1);cout<<"PreOrder: "<<endl;tree->preOrder(traverse);cout<<endl;cout<<"LevelOrder: "<<endl;tree->levelOrder(traverse);cout<<endl;cout<<"InOrder: "<<endl;tree->inOrder(traverse);cout<<endl;cout<<"PostOrder: "<<endl;tree->postOrder(traverse);cout<<endl;cout<<tree->find(2)<<endl;tree->insert(make_pair(9,9));tree->levelOrder(traverse);}运⾏结果以上就是C++实现AVL树的完整代码的详细内容,更多关于C++ AVL树的资料请关注其它相关⽂章!。
以下是一个示例的树形结构代码,用Python语言实现:```pythonclass TreeNode:def __init__(self, data):self.data = dataself.children = []def add_child(self, child):self.children.append(child)def build_tree():root = TreeNode("A")node_b = TreeNode("B")node_b.add_child(TreeNode("E"))node_b.add_child(TreeNode("F"))node_c = TreeNode("C")node_c.add_child(TreeNode("G"))node_c.add_child(TreeNode("H"))node_d = TreeNode("D")node_d.add_child(TreeNode("I"))root.add_child(node_b)root.add_child(node_c)root.add_child(node_d)return rootdef print_tree(node, level=0):prefix = " " * levelprint(prefix + node.data)for child in node.children:print_tree(child, level + 1)# 构建树tree_root = build_tree()# 打印树print_tree(tree_root)```这段代码定义了一个TreeNode类,表示树的节点。
//by svking//2012.5#include <stdio.h>#include <stdlib.h>#include <time.h>#define MAXSIZE 1000typedef int ElemType;#define RED 0#define BLACK 1typedef struct RBTNode{char color;ElemType data;struct RBTNode * p;struct RBTNode * left;struct RBTNode * right;}RBTNode, * PRBTNode;typedef struct RBTree{PRBTNode root;PRBTNode nil; //统一的空节点,该节点是黑的}RBTree, * PRBTree;int leftRotate (PRBTree tree, PRBTNode t);int rightRotate (PRBTree tree, PRBTNode t);PRBTNode insertRB (PRBTree tree, ElemType d);int insertRB_fixup (PRBTree tree, PRBTNode t);int createRBTree (PRBTree tree, ElemType d[], int n); int initRB (PRBTree tree);PRBTNode maximum (PRBTree tree, PRBTNode t); PRBTNode minimum (PRBTree tree, PRBTNode t); PRBTNode next (PRBTree tree, PRBTNode t);PRBTNode precursor (PRBTree tree, PRBTNode t);int walkNext (PRBTree tree);int inOrderWalk (PRBTree tree, PRBTNode t);int deleteRB_fixup (PRBTree tree, PRBTNode c); PRBTNode deleteRB (PRBTree tree, PRBTNode t);int main (){PRBTNode p;int d[MAXSIZE];int n = 0;int i;RBTree tree;initRB(&tree);/*insertRB(&tree, 11);insertRB(&tree, 2);insertRB(&tree, 14);insertRB(&tree, 1);insertRB(&tree, 7);insertRB(&tree, 15);insertRB(&tree, 5);insertRB(&tree, 8);insertRB(&tree, 4);*/p= insertRB(&tree, 26);insertRB(&tree, 17);insertRB(&tree, 41);insertRB(&tree, 14);insertRB(&tree, 21);insertRB(&tree, 30);insertRB(&tree, 47);insertRB(&tree, 10);insertRB(&tree, 16);insertRB(&tree, 19);insertRB(&tree, 23);insertRB(&tree, 28);insertRB(&tree, 38);insertRB(&tree, 7);insertRB(&tree, 12);insertRB(&tree, 15);insertRB(&tree, 20);insertRB(&tree, 3);insertRB(&tree, 35);insertRB(&tree, 39);srand(time(NULL));/*puts("请输入数据的个数:");scanf("%d",&n);printf("随机生成的%d个数据是:\n",n); for (i = 0; i < n; i++){d[i] = rand()%1000;printf("%d ",d[i]);}puts("");puts("建树开始");createRBTree(&tree, d, n);*/inOrderWalk(&tree,tree.root);puts("");printf("根是%d \n",tree.root->data);printf("删除%d后:",p->data);deleteRB(&tree, p);inOrderWalk(&tree,tree.root);puts("");printf("根是%d \n",tree.root->data);return0;}PRBTNode insertRB (PRBTree tree, ElemType d){//插入元素//!!!记得插入的元素的初始化,p指向为父母节点,left和right赋值为NULL。
平衡二叉树实现代码平衡二叉树(Balanced Binary Tree),也叫 AVL 树,是一种特殊的二叉树,它的每个节点的左子树和右子树的高度差不超过1、当插入或删除一个节点后,如果导致树的不平衡,就通过旋转操作来恢复平衡。
下面是平衡二叉树的实现代码:```python#定义平衡二叉树的节点类class AVLNode:def __init__(self, key):self.key = keyself.left = Noneself.right = Noneself.height = 1#定义平衡二叉树类class AVLTree:def __init__(self):self.root = None#获取节点的高度def get_height(self, node):if node is None:return 0return node.height#计算平衡因子def get_balance(self, node):if node is None:return 0return self.get_height(node.left) -self.get_height(node.right)#左旋操作def left_rotate(self, z):y = z.rightT2 = y.lefty.left = zz.right = T2z.height = 1 + max(self.get_height(z.left), self.get_height(z.right))y.height = 1 + max(self.get_height(y.left), self.get_height(y.right))return y#右旋操作def right_rotate(self, z):y = z.leftT3 = y.righty.right = zz.left = T3z.height = 1 + max(self.get_height(z.left), self.get_height(z.right))y.height = 1 + max(self.get_height(y.left), self.get_height(y.right))return y#插入节点def insert(self, key):def insert_node(node, key):if node is None:return AVLNode(key)elif key < node.key:node.left = insert_node(node.left, key)else:node.right = insert_node(node.right, key)node.height = 1 + max(self.get_height(node.left), self.get_height(node.right))balance = self.get_balance(node)#如果节点不平衡,进行旋转操作来恢复平衡if balance > 1:if key < node.left.key:return self.right_rotate(node)else:node.left = self.left_rotate(node.left)return self.right_rotate(node)if balance < -1:if key > node.right.key:return self.left_rotate(node)else:node.right = self.right_rotate(node.right)return self.left_rotate(node)return nodeself.root = insert_node(self.root, key)#删除节点def delete(self, key):def delete_node(node, key):if node is None:return nodeelif key < node.key:node.left = delete_node(node.left, key) elif key > node.key:node.right = delete_node(node.right, key) else:if node.left is None:temp = node.rightnode = Nonereturn tempelif node.right is None:temp = node.leftnode = Nonereturn temptemp = self.get_min_value_node(node.right)node.key = temp.keynode.right = delete_node(node.right, temp.key)if node is None:return nodenode.height = 1 + max(self.get_height(node.left), self.get_height(node.right))balance = self.get_balance(node)#如果节点不平衡,进行旋转操作来恢复平衡if balance > 1:if self.get_balance(node.left) >= 0:return self.right_rotate(node)else:node.left = self.left_rotate(node.left)return self.right_rotate(node)if balance < -1:if self.get_balance(node.right) <= 0:return self.left_rotate(node)else:node.right = self.right_rotate(node.right)return self.left_rotate(node)return nodeself.root = delete_node(self.root, key) #获取以一些节点为根的子树中的最小值节点def get_min_value_node(self, node):if node is None or node.left is None: return nodereturn self.get_min_value_node(node.left) #中序遍历树def inorder_traversal(self):def inorder(node):if node is None:returninorder(node.left)print(node.key, end=" ")inorder(node.right)inorder(self.root)#测试代码if __name__ == '__main__':tree = AVLTreenodes = [50, 30, 70, 20, 40, 60, 80, 25, 10, 55]for node in nodes:tree.insert(node)print("平衡二叉树中序遍历结果:")tree.inorder_traversalprint("\n删除节点 40 后的平衡二叉树中序遍历结果:")tree.delete(40)tree.inorder_traversal```以上就是平衡二叉树的实现代码,代码中包含了平衡二叉树节点类的定义,以及插入节点、删除节点、左旋和右旋操作等方法的实现。
python中绘制树的方法一、前言树结构在计算机科学中有着广泛的应用,如文件系统、数据库索引等。
Python作为一门优秀的编程语言,提供了许多绘制树的方法,本文将介绍其中几种常用的方法。
二、使用turtle库绘制树turtle库是Python自带的图形库,可以用来绘制各种图形。
使用turtle库绘制树需要以下步骤:1.导入turtle库和random库import turtleimport random2.定义一个函数draw_tree,该函数接受5个参数:t(画笔)、branchLen(分支长度)、angle(分支角度)、level(分支层数)、pensize(画笔粗细)。
def draw_tree(t, branchLen, angle, level, pensize):if level > 0:t.pensize(pensize)t.forward(branchLen)t.right(angle)draw_tree(t, branchLen*random.uniform(0.7, 0.9), angle*random.uniform(0.8, 1.2), level-1, pensize-1)t.left(angle*2)draw_tree(t, branchLen*random.uniform(0.7, 0.9), angle*random.uniform(0.8, 1.2), level-1, pensize-1)t.right(angle)t.backward(branchLen)3.设置画布大小和背景颜色t = turtle.Turtle()myWin = turtle.Screen()myWin.bgcolor("white")t.left(90)t.up()t.backward(200)t.down()t.color("green")4.调用draw_tree函数绘制树draw_tree(t, 100, 20, 10, 10)三、使用matplotlib库绘制树matplotlib库是Python中常用的数据可视化库,也可以用来绘制树。
附4:树种代码表树种代码树种代码树种代码树种代码红松10桤木315芒果513蚕桑801冷杉20槭树316荔枝514蚕柞802云杉30楝树317海棠515榛子803紫杉40榆树318青梅516木豆804铁杉50朴树319杨梅517茉莉花805柏木60合欢320无花果518其他经济树种810落叶松70相思321石榴519樟子松80檀树322枇杷520沙柳901赤松90楸树323仁用杏521毛条902黑松100杨树324杏树522柠条903油松110柳树325其他果树523柽柳904华山松120拟赤扬326油茶551花棒905油杉130珙桐327油橄榄552踏朗906马尾松140梧桐328文冠树553沙拐枣907国外松141刺桐329油棕554梭梭908黄山松142杜英330其他食用油料树种559沙棘909云南松150喜树331茶601紫穗槐910思茅松160女贞332咖啡602车桑子911高山松170枫香333可可603栀子912其他松171连香树334其他饮料树种609山桃913杉木180泡桐335花椒651沙枣914柳杉190枫杨336八角652其他灌木树种920水杉200香果树337肉桂653其他杉201椿树338胡椒654金银花940水曲柳210榕树339桂花655猕猴桃941胡桃秋211任豆340其他调香料树种659葡萄942黄菠萝212刺楸341杜仲701五味子943樟树220山桂花342厚朴702其他藤本950楠木230椰子343枸杞703栎类240槟榔344银杏704桦木250其他软阔类350山杏705重阳木251杂木360山楂706皂荚252矮林370黄皮707木荷253黄柏708其他硬阔类260毛竹401木瓜709槐类300杂竹402青刺尖710椴树类301其他竹403山茱萸711檫木302吴茱萸712香榧303柑桔类501其他药材树种720桉树304苹果502漆树751南酸枣305梨桃类503紫胶寄主树752蓝果树306枣504油桐753木连307柿505乌桕754红豆树308板栗506棕榈755领春木309核桃507橡胶756银鹊树310李子508腊树757火炬树311樱桃509栓皮栎758栾树312篮莓510膏桐(麻风树)759蓝花楹313树莓511其他工业原料树种770木麻黄314龙眼512。
第一题:#include<iostream>#include<stdio.h>using namespace std;struct node{int data;node* ls;node* rs;node(){ls=NULL;rs=NULL;}};int n;void create(node*& r,int s){if(r){if(s<r->data) create(r->ls,s);else create(r->rs,s);}else{node *p=new node();p->data=s;r=p;return;}}void in(node* r,int s){if(r){if(s<r->data) create(r->ls,s);else create(r->rs,s);}else{node *p=new node();p->data=s;if(s<r->data)r->ls=p;elser->rs=p;n++;return ;}}void mid(node* r){if(r){mid(r->ls);cout<<r->data<<" ";mid(r->rs);}}int main(){node* root=NULL;int i,t,s;// freopen("cin.txt","r",stdin);cin>>t;while(t--){cin>>n;for(i=1;i<=n;i++){cin>>s;create(root,s);}mid(root);cout<<endl;int m;cin>>m;for(i=1;i<=m;i++){cin>>s;in(root,s);mid(root);cout<<endl;}}return 0;}第二题:#include<iostream>#include<stdio.h>using namespace std;struct node{int data;node* ls;node* rs;node(){ls=NULL;rs=NULL;}};int n,sum=0;void create(node*& r,int s){if(r){if(s<r->data) create(r->ls,s);else create(r->rs,s);}else{node *p=new node();p->data=s;r=p;return;}}int find(node* r,int s){if(r){sum++;if(s==r->data) return sum;if(s<r->data) return find(r->ls,s);if(s>r->data) return find(r->rs,s);}else{sum++;return -1;}}void mid(node* r){if(r){mid(r->ls);cout<<r->data<<" ";mid(r->rs);}}int main(){node* root=NULL;int i,t,s;// freopen("cin.txt","r",stdin);cin>>t;while(t--){cin>>n;for(i=1;i<=n;i++){cin>>s;create(root,s);}mid(root);cout<<endl;int m;cin>>m;for(i=1;i<=m;i++){cin>>s;sum=0;cout<<find(root,s)<<endl;}}return 0;}第三题:#include<iostream>#include<stdio.h>using namespace std;struct node{char data;node* ls;node* rs;node(){ls=NULL;rs=NULL;}};int n,sum=0,k=0,pos=0;char cc[400];node* create(node*r){char s=cc[pos++];if(s=='0'){r=NULL;}else{node*p=new node();p->data=s;r=p;r->ls=create(r->ls);r->rs=create(r->rs);}return r;}void pre(char c[],int i){if(c[i]=='0'||c[i]==NULL){cc[k++]='0';}else{cc[k++]=c[i];pre(c,i*2);pre(c,i*2+1);}}int num=2;void mid(node* r){if(r){mid(r->ls);if(num<n){cout<<r->data<<" ";num++;}else {cout<<r->data<<endl;return;}mid(r->rs);}}void pre(node* r){if(r){if(num<n){cout<<r->data<<" ";num++;}else {cout<<r->data<<endl;return;}pre(r->ls);pre(r->rs);}}void out(node* r){if(r){out(r->ls);out(r->rs);if(num<n){cout<<r->data<<" ";num++;}else {cout<<r->data<<endl;return;} }}int main(){node* root=NULL;int i,s;char c[400]={NULL};// freopen("cin.txt","r",stdin);cin>>n;for(i=1;i<=n;i++){cin>>c[i];}for(i=1;i<n;i++)cout<<c[i]<<" ";cout<<c[n]<<endl;root=create(root);pre(root);num=2;mid(root);num=2;out(root);cout<<endl;return 0;}第四题:#include<iostream>#include<stdio.h>#include<string.h>using namespace std;struct node{char data;node* ls;node* rs;node(){ls=NULL;rs=NULL;}};int n,sum=1,k=0,pos=1;char cc[400];node* create(node*r,char c[]) {char s=c[pos++];if(s=='0'){r=NULL;}else{node*p=new node();r=p;r->ls=create(r->ls,c);r->rs=create(r->rs,c);}return r;}void pre(node*r,int i){if(r){cc[i]=r->data;sum++;pre(r->ls,2*i);pre(r->rs,2*i+1);}}int num=2;void mid(int i){if(cc[i]!='0'&&cc[i]!=NULL){mid(2*i);if(num<sum){cout<<cc[i]<<" ";num++;}else {cout<<cc[i]<<endl;return;}mid(2*i+1);}}void pre(int i){if(cc[i]!='0'&&cc[i]!=NULL){if(num<sum){cout<<cc[i]<<" ";num++;}else {cout<<cc[i]<<endl;return;}pre(2*i);pre(2*i+1);}}void out(int i){if(cc[i]!='0'&&cc[i]!=NULL){out(2*i);out(2*i+1);if(num<sum){cout<<cc[i]<<" ";num++;}else {cout<<cc[i]<<endl;return;} }}int main(){node* root=NULL;int i,s;char c[400]={NULL};// freopen("cin.txt","r",stdin);memset(cc,'0',sizeof(cc));cin>>n;for(i=1;i<=n;i++){cin>>c[i];}root=create(root,c);pre(root,1);for(i=1;i<sum;i++)cout<<cc[i]<<" ";cout<<cc[sum]<<endl;pre(1);num=2;mid(1);num=2;out(1);cout<<endl;return 0; }。