二叉树的建立以及相关操作,平衡二叉树

二叉树的一些属性:

int datdID;
double data;
TreeNode leftTree;
TreeNode rightTree;
TreeNode parent;

//构建一个二叉树,将数据都放入了一个LIST里面
    int selfID = 0;
    public TreeNode creatTree(List<Double>datas,TreeNode tree){
        if(datas.size()!=0){
            TreeNode node = new TreeNode();
            node.setDatdID(selfID);
            node.setData(datas.get(0));

//System.out.println(node.getData());
            node.setLeftTree(null);
            node.setRightTree(null);
            if(tree==null){
                datas.remove(0);
                tree = node;
            }else{

TreeNode P = searchParent(node.getData(),tree);

node.setParent(P);
                if(P.getData()>node.getData()){
                    P.setLeftTree(node);
                }else{
                    P.setRightTree(node);
                }
                datas.remove(0);
            }
            creatTree(datas,tree);
        }
        return tree;

}

下列操作分别是查找节点的父节点以及4种遍历,其中要注意一下非递归方式去遍历

    public TreeNode searchParent(double data,TreeNode tree){
        TreeNode P = new TreeNode();
        if(tree.getLeftTree()==null&&tree.getRightTree()==null){
            return tree;
        }else{
            if(data<tree.getData()){
                if(tree.getLeftTree()==null){
                    return tree;
                }else{
                    P=searchParent(data,tree.getLeftTree());
                }
            }else{
                if(tree.getRightTree()==null){

                    return tree;
                }else{
                    P=searchParent(data,tree.getRightTree());

                }
            }
            return P;
        }

    }

    //前序遍历(深度遍历)
    public void PreOrderTraversal(TreeNode tree){
        if(tree!=null){
            System.out.println(tree.getData());
            PreOrderTraversal(tree.getLeftTree());
            PreOrderTraversal(tree.getRightTree());
        }
    }

    //中序遍历
    public void MidOrderTraversal(TreeNode tree){
        if(tree!=null){
            MidOrderTraversal(tree.getLeftTree());
            System.out.println(tree.getData());
            MidOrderTraversal(tree.getRightTree());
        }
    }

    //后续遍历
    public void AftOrderTraversal(TreeNode tree){
        if(tree!=null){
            AftOrderTraversal(tree.getRightTree());
            System.out.println(tree.getData());
            AftOrderTraversal(tree.getLeftTree());
        }
    }

    //层次遍历(广度遍历)
    public void  LayerOrder(TreeNode root) {
        System.out.println(root.getData());
        List<TreeNode>list = new ArrayList();
        list.add(root);
        int level = 1;
        int count = 0;
        while(!list.isEmpty()){
            List<TreeNode>childList = new ArrayList();
            while(!list.isEmpty()){
                childList.add(list.get(0));
                list.remove(0);
            }
            boolean flag = false;
            //宽度
            System.out.println("第"+count+++"层有节点  "+childList.size()+"个");
            for(int i = 0;i<childList.size();i++){
                if(childList.get(i).getLeftTree()!=null){
                    System.out.println(childList.get(i).getLeftTree().getData());
                    list.add(childList.get(i).getLeftTree());
                    flag = true;
                }
                if(childList.get(i).getRightTree()!=null){
                    System.out.println(childList.get(i).getRightTree().getData());
                    list.add(childList.get(i).getRightTree());
                    flag = true;
                }
            }
            if(flag){
                level++;
            }
        }
        //深度
        System.out.println("二叉树一共"+level+"层");

    }

    //非递归方法实现前序遍历
    public void preordernorec(TreeNode root){
        TreeNode pnode = root;
        Stack stack = new Stack();
        stack.push(root);
        while(!stack.isEmpty()){
            root = (TreeNode) stack.pop();
            System.out.println(root.getData());

            if(root.getRightTree()!=null){
                stack.push(root.getRightTree());
            }
            if(root.getLeftTree()!=null){
                stack.push(root.getLeftTree());
            }
        }

    }

    //交换二叉树的左右儿子,即二叉树的镜像
    public TreeNode exchange(TreeNode tree){
        if(tree==null){
            return tree;
        }else{
            //    System.out.println(tree.getData());
            TreeNode temp = tree.getLeftTree();
            tree.setLeftTree(tree.getRightTree());
            tree.setRightTree(temp);
            exchange(tree.getLeftTree());
            exchange(tree.getRightTree());
        }
        return tree;
    }

    //判断是否为完全二叉树
    public Boolean IsComplete(TreeNode tree){
        List<TreeNode>list = new ArrayList();
        list.add(tree);
        int level = lengthTree(tree);
        int count = 0;
        boolean flag = true;
        List<TreeNode> listresult = new ArrayList();
        while(level>2){
            List<TreeNode>childList = new ArrayList();
            while(!list.isEmpty()){
                childList.add(list.get(0));
                list.remove(0);
            }
            //宽度
            System.out.println("第"+count+++"层有节点  "+childList.size()+"个");
            for(int i = 0;i<childList.size();i++){
                if(childList.get(i).getLeftTree()!=null){
                    list.add(childList.get(i).getLeftTree());
                }else{

                    flag = false;
                }
                if(childList.get(i).getRightTree()!=null){
                    list.add(childList.get(i).getRightTree());
                }else{
                    flag = false;
                }
                if(flag == false){
                    break;
                }
            }
            listresult = childList;
            if(flag == false){
                break;
            }
            level = level-1;
        }
        int childLength = listresult.size();
        for(int i = 0;i<childLength;i++){

            if(listresult.get(i).getLeftTree()==null){
                flag =false;
            }

        }
        return flag;
    }

    //判断是否为平衡二叉树
    public Boolean IsBanlance(TreeNode tree){
        if(tree==null){
            return true;
        }else{
            if(tree.getLeftTree()!=null&&tree.getRightTree()!=null){
                int leftLength = lengthTree(tree.getLeftTree());
                int rightLength = lengthTree(tree.getRightTree());
                if(Math.abs(leftLength-rightLength)>1){
                    return false;
                }
            }else {
                if(tree.getLeftTree()!=null){
                    IsBanlance(tree.getLeftTree());
                }
                if(tree.getRightTree()!=null){
                    IsBanlance(tree.getRightTree());
                }
            }
        }
        return true;
    }

    //求树的深度
    public int  lengthTree(TreeNode root) {
        List<TreeNode>list = new ArrayList();
        list.add(root);
        int level = 1;
        while(!list.isEmpty()){
            List<TreeNode>childList = new ArrayList();
            while(!list.isEmpty()){
                childList.add(list.get(0));
                list.remove(0);
            }
            boolean flag = false;
            for(int i = 0;i<childList.size();i++){
                if(childList.get(i).getLeftTree()!=null){
                    list.add(childList.get(i).getLeftTree());
                    flag = true;
                }
                if(childList.get(i).getRightTree()!=null){
                    list.add(childList.get(i).getRightTree());
                    flag = true;
                }
            }
            if(flag){
                level++;
            }
        }
        //深度
        return level;

    }

//平衡二叉树的旋转

//左旋变换
    public TreeNode SingleRotateWithLeft(TreeNode k2){
        TreeNode k1 = new TreeNode();
        k1 = k2.getLeftTree();
        k2.setLeftTree(k1.getRightTree());
        k1.setRightTree(k2);
        return k1;

}

//右旋变化换
    public TreeNode SingleRotateWithRight(TreeNode k2){
        TreeNode k1 = new TreeNode();
        k1 = k2.getRightTree();
        k2.setRightTree(k1.getLeftTree());
        k1.setLeftTree(k2);
        return k1;
    }

//先进行一次右旋再进行一次左旋
    public TreeNode DoubleRotateWithLeft(TreeNode k3){
        k3.setLeftTree(SingleRotateWithRight(k3.getLeftTree()));
        return SingleRotateWithLeft(k3);
    }

//先进行一次左旋再进行一次右旋
    public TreeNode DoubleRotateWithRight(TreeNode k3){
        k3.setRightTree(SingleRotateWithLeft(k3.getRightTree()));
        return SingleRotateWithRight(k3);
    }
//http://blog.csdn.net/a454042522/article/details/8591421          http://www.cppblog.com/cxiaojia/archive/2012/08/20/187776.html

//可以参考一下,

时间: 2024-10-17 15:03:12

二叉树的建立以及相关操作,平衡二叉树的相关文章

二叉树各种相关操作(建立二叉树、前序、中序、后序、求二叉树的深度、查找二叉树节点,层次遍历二叉树等)(C语言版)

将二叉树相关的操作集中在一个实例里,有助于理解有关二叉树的相关操作: 1.定义树的结构体: 1 typedef struct TreeNode{ 2 int data; 3 struct TreeNode *left; 4 struct TreeNode *right; 5 }TreeNode; 2.创建根节点: 1 TreeNode *creatRoot(){ 2 TreeNode * root =(TreeNode *)malloc(sizeof(TreeNode)); 3 if(NULL=

二叉树的相关操作

#include<stdio.h> #include<malloc.h> #define MAXSIZE 20 typedef char TEelemtype; typedef struct BiTNode{ TEelemtype data; struct BiTNode *lchild,*rchild; }BiTNode,*BiTree; //队列的方式 typedef struct queueelem { BiTNode* b[MAXSIZE]; int front,rear;

android DataBase的相关操作(建立表结构和创建表)

先建立一个table的基类: public abstract class DbBaseTable { private static final String TAG = "DbBaseTable"; /** * @return the DB table name */ abstract String getName(); /** * Creates the DB table according to the DB scheme * * @param db */ abstract voi

二叉树的建立和遍历

二叉树是十分重要的数据结构,主要用来存放数据,并且方便查找等操作,在很多地方有广泛的应用. 今天主要写的最基本的二叉树,后续会继续写线索二叉树,二叉排序树,平衡二叉树等. 二叉树的建立思路仍然是采用的递归的思想,给定一个指向根节点的指针,然后递归调用ceate()函数,自动生成一个二叉树.就像是在地上挖了个坑(根节点),然后他会拿着斧子(create函数)自己挖一颗很大的洞穴(二叉树)出来.当然挖坑前需要先定义每个洞长什么样(定义节点结构). 1 #include<iostream> 2 us

linux下进程相关操作

一.定义和理解 狭义定义:进程是正在运行的程序的实例. 广义定义:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动. 进程的概念主要有两点: 第一,进程是一个实体.每一个进程都有它自己的地址空间,一般情况下,包括文本区域.数据区域和堆栈区域.文本区域存储处理器执行的代码:数据区域存储变量和进程执行期间使用的动态分配的内存:堆栈区域存储着活动过程调用的指令和本地变量. 第二,进程是一个“执行中的程序”.程序是一个没有生命的实体,只有处理器赋予程序生命时,它才能成为一个活动的实体,我们

12.遍历二叉树与二叉树的建立

一.遍历二叉树 1.定义 二叉树的遍历(travering binary tree)是指从根结点出发,按照某种次序依次访问二叉树中的所有结点,使得每个结点被访问一次且仅被访问一次. 2.前序遍历 (1)规则:若二叉树为空,则空操作返回.否则,先访问根结点,然后前序遍历左子树,再前序遍历右子树. (2)实例 前序遍历结果为:A BDGH CEIF 分析:当最先访问根结点后,然后前序遍历左子树.当访问根的左子树时,这里"前序遍历"即我们将B假设为左子树的根来遍历. (3)算法 从二叉树定义

CS数据库的相关操作

备注:我们对于CS数据库的操作多数情况下只是查询操作,尽量不要在数据库中直接修改记录的值 第一.首先备份数据库 1.进入mysql数据库 [[email protected] ~]# mysql -u root -p Enter password: Welcome to the MySQL monitor.  Commands end with ; or \g. Your MySQL connection id is 188 Server version: 5.1.61-log Source d

二叉树的性质和常用操作代码集合

二叉树的性质和常用操作代码集合 性质: 二叉树的性质和常用代码操作集合 性质1:在二叉树的第i层上至多有2^i-1个结点 性质2:深度为k的二叉树至多有2^k - 1个结点 性质3:对任意一棵二叉树T,若终端结点数为n0,而其度数为2的结点数为n2,则n0 = n2 + 1 满二叉树:深度为k且有2^-1个结点的树 完全二叉树:深度为k,结点数为n的二叉树,如果其结点1~n的位置序号分别与等高的满二叉树的结 点1~n的位置序号一一对应,则为完全二叉树. 性质4:具有n的结点的完全二叉树深度为lo

STL之heap相关操作算法

说明:本文仅供学习交流,转载请标明出处,欢迎转载! 堆(heap)是一种非常重要的数据结构(这里我们讨论的是二叉堆),它是一棵满足特定条件的完全二叉树,堆的定义如下: 堆是一棵树完全二叉树,对于该完全二叉树中的每一个结点x,其关键字大于等于(或小于等于)其左右孩子结点,而其左右子树均为一个二叉堆. 在上述的定义中,若堆中父亲结点关键字的值大于等于孩子结点,则称该堆为大顶堆:若堆中父亲结点关键子的值小于等于孩子结点,则称该堆为小顶堆. 由于堆是一棵完全二叉树,所以我们可以很轻易地用一个数组存储堆中