求数据结构算法平衡二叉树实现代码

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求数据结构算法平衡二叉树实现代码相关的知识,希望对你有一定的参考价值。

参考技术A 抄的,你能看懂就行。平衡二叉树实现代码
  #include <stdio.h>
  typedef struct bitreetype
  
  int item;
  int bdegree;/*平衡因子,左子树深度-右子树深度*/
  struct bitreetype *lchild;
  struct bitreetype *rchild;
  bitree;
  typedef struct treequeuetype
  
  int head;
  int tail;
  bitree *items[1000];
  treequeue;/*定义一个队列,后面的平衡调整要用层序遍历,于是要用这个队列*/
  void resetqueue(treequeue *queue)
  
  queue->head=-1;
  queue->tail=-1;
  return;
  /*把队列清空*/
  void inqueue(treequeue *queue,bitree *element)
  
  queue->tail++;
  queue->items[queue->tail]=element;
  /*入队列*/
  bitree *outqueue(treequeue *queue)
  
  queue->head++;
  return queue->items[queue->head];
  /*出队列*/
  int isqueueempty(treequeue *queue)
  
  if(queue->head==queue->tail)
  return 1;
  else
  return 0;
  /*判断队列是否为空*/
  void fillmemory(char *source,int len,char content)
  
  while(len)
  
  source=source+len;
  *source=content;
  source=source-len;
  len--;
  
  *source=0;
  /*用CONTENT的内容去FILL以SOURCE为首,LEN长度的一块空间,初始化内存方便*/
  int getnums(int *dst)/*输入字符串并把字符串转化为一串数存入DST指向的内存中去,我们用它采集原始数据*/
  
  char *temp,*num,*p,t;
  int len=0;
  temp=(char *)malloc(1000*sizeof(char));
  num=(char *)malloc(20*sizeof(char));
  p=num;
  fillmemory(temp,1000,0);
  fillmemory(num,20,0);
  scanf(\"%s\",temp);
  t=*temp;
  temp++;
  while(t)
  
  if(t!=\’,\’)
  
  *num=t;
  num++;
  t=*temp;
  temp++;
  /*抽出一个数放入NUM临时空间中*/
  else
  
  num=p;
  *dst=atoi(num);
  len++;
  fillmemory(num,20,0);
  dst++;
  t=*temp;
  temp++;
  /*将NUM中的数字转化出来存入DST中*/
  
  num=p;
  *dst=atoi(num);
  len++;
  fillmemory(num,20,0);
  dst++;
  t=*temp;
  temp++;
  return len;
  /*处理最后一个数字*/

数据结构&算法-AVL平衡二叉树

概念

高度平衡的二叉排序树。我们将二叉树上结点的左子树深度减去右子树深度的值成为平衡因子。平衡因子的绝对值不大于1就是平衡二叉树了。

运算结果

代码

using System;

namespace AVLBalancedBinaryTrees

    class Program
    
        static void Main(string[] args)
        

            Tree tree = new Tree();
            tree.Inset(16);
            tree.Inset(3);
            tree.Inset(7);
            tree.Inset(11);
            tree.Inset(9);
            tree.Inset(26);
            tree.Inset(18);
            tree.Inset(14);
            tree.Inset(15);
            tree.Inset(115);
            tree.Inset(315);
            tree.Inset(44);
            tree.Inset(58);
            tree.Inset(31);

            tree.InOrder();
            Console.ReadKey();
        
    
    class Node
    
        public int data;//数据
        public Node left;//左孩子
        public Node right;//又孩子
        public Node parent;
        public int BF;//平衡因子,左-右 数量
        public Node(int data)
        
            this.data = data;
        
    

    class Tree
    
        Node root;
        int count;
        public void Inset(int data)
        
            if (root == null)
            
                root = new Node(data);
                return;
            
            Node currentNode = root;
            Node parentNode = root;


            while (currentNode != null)
            
                parentNode = currentNode;
                if (data < currentNode.data)
                

                    currentNode = currentNode.left;

                
                else
                

                    currentNode = currentNode.right;

                

            
            currentNode = new Node(data);
            currentNode.parent = parentNode;
            //来到这里说明已经符合条件的位置了
            if (data < parentNode.data)
            
                parentNode.left = currentNode;
            
            else
            
                parentNode.right = currentNode;
            
            while (parentNode != null)
            
                if (parentNode.left == currentNode)
                
                    parentNode.BF++;
                
                else
                
                    parentNode.BF--;
                
                if (parentNode.BF == 0)
                
                    break;
                
                else if (parentNode.BF == -1 || parentNode.BF == 1)
                
                    currentNode = parentNode;
                    parentNode = currentNode.parent;
                
                else
                
                    if (parentNode.BF == 2)
                    
                        if (currentNode.BF == 1)//LL
                        
                            RotaeLL(parentNode);
                        
                        else
                        
                            RotateLR(parentNode);
                        
                    
                    else
                    
                        if (currentNode.BF == -1)
                        
                            RotateRR(parentNode);
                        
                        else
                        
                            RotateRL(parentNode);
                        
                    
                    break;
                

            
            count++;

        

        void RotaeLL(Node parent)
        
            Node grandParent = parent.parent;
            Node curNode = parent.left;
            if (grandParent != null)
            
                if (grandParent.left == parent)
                
                    grandParent.left = curNode;
                    curNode.parent = grandParent;
                    grandParent.BF--;
                
                else
                
                    grandParent.right = curNode;
                    curNode.parent = grandParent;
                    grandParent.BF++;
                
            
            else
            
                curNode.parent = null;
                root = curNode;
            

            parent.left = curNode.right;
            if (parent.left != null)
            
                parent.left.parent = parent;
            
            curNode.right = parent;
            parent.parent = curNode;
            curNode.BF--;
            parent.BF--;
        


        public void RotateLR(Node parent)
        

            Node grandParent = parent.parent;
            Node curNode = parent.left;
            Node c = curNode.right;
            if (grandParent != null) //若存在G, 则将c改为g的孩子
            
                if (grandParent.left == parent)
                
                    grandParent.left = c;
                    c.parent = grandParent;
                    grandParent.BF--;
                
                else
                
                    grandParent.right = c;
                    c.parent = grandParent;
                    grandParent.BF++;
                
            
            else //若不存在G
            
                c.parent = null;
                root = c;
            
            //将cur的右孩子改为x3
            curNode.right = c.left;
            if (curNode.right != null)
            
                curNode.right.parent = curNode;
            
            //将p的左孩子改为X4
            parent.left = c.right;
            if (parent.left != null)
            
                parent.left.parent = parent;
            
            //将c的左孩子改为cur
            c.left = curNode;
            curNode.parent = c;
            //将c的右孩子改为P
            c.right = parent;
            parent.parent = c;

            parent.BF = 0;
            curNode.BF++;
            c.BF = curNode.BF;
        
        public void RotateRR(Node parent)
        

            Node grandParent = parent.parent;
            Node curNode = parent.right;
            if (grandParent != null) //若存在G, 则将cur改为g的孩子
            
                if (grandParent.left == parent)
                
                    grandParent.left = curNode;
                    curNode.parent = grandParent;
                    grandParent.BF--;
                
                else
                
                    grandParent.right = curNode;
                    curNode.parent = grandParent;
                    grandParent.BF++;
                
            
            else //若不存在G
            
                curNode.parent = null;
                root = curNode;
            
            parent.right = curNode.left; //将cur的左孩子X2改为P的右孩子
            if (parent.right != null)
            
                parent.right.parent = parent; //将P改为X2的parent
            
            curNode.left = parent; //将P改为cur的左孩子
            parent.parent = curNode; //将cur改为P的parent
            curNode.BF++;
            parent.BF++;
        
        public void RotateRL(Node parent)
        

            Node grandParent = parent.parent;
            Node curNode = parent.right;
            Node c = curNode.left;
            if (grandParent != null) //若存在G, 则将c改为g的孩子
            
                if (grandParent.left == parent)
                
                    grandParent.left = c;
                    c.parent = grandParent;
                    grandParent.BF--;
                
                else
                
                    grandParent.right = c;
                    c.parent = grandParent;
                    grandParent.BF++;
                
            
            else //若不存在G
            
                c.parent = null;
                root = c;
            
            //将cur的左孩子改为x4
            curNode.left = c.right;
            if (curNode.left != null)
            
                curNode.left.parent = curNode;
            
            //将p的右孩子改为X3
            parent.right = c.left;
            if (parent.right != null)
            
                parent.right.parent = parent;
            
            //将c的右孩子改为cur
            c.right = curNode;
            curNode.parent = c;
            //将c的左孩子改为P
            c.left = parent;
            parent.parent = c;

            parent.BF = 0;
            curNode.BF--;
            c.BF = -curNode.BF;
        

        public void InOrder()
        
            _InOrder(root);
        

        private void _InOrder(Node node)
        
            if (node == null)
            
                return;
            

            _InOrder(node.left);
            Console.Write(node.data + " ");
            _InOrder(node.right);
        
    


参考

平衡二叉树(AVL树)的基本操作

C# AVL树(平衡二叉树)的实现

以上是关于求数据结构算法平衡二叉树实现代码的主要内容,如果未能解决你的问题,请参考以下文章

平衡二叉树的算法

数据结构与算法二叉树——平衡二叉树

算法总结:左神class5—二叉树是否是平衡二叉树,搜索二叉树,平衡二叉树

D13-平衡二叉树[Java数据结构和算法]

Day584&585.平衡二叉树 -数据结构和算法Java

白话平衡二叉树