javase(3)_二叉树

// 1.求二叉树中的节点个数
// 2.求二叉树的深度
// 3.前序遍历,中序遍历,后序遍历
// 4.分层遍历二叉树(按层次从上往下,从左往右)
// 5.将二叉查找树变为有序的双向链表
// 6.求二叉树第K层的节点个数
// 7.求二叉树中叶子节点的个数
// 8.判断两棵二叉树是否结构相同
// 9.判断二叉树是不是平衡二叉树// 10.判断二叉树是不是完全二叉树

节点

class Node{
    Node leftChild;
    Node rightChild;
    Object value;
    public Node(Node leftChild, Node rightChild, Object value) {
        this.leftChild = leftChild;
        this.rightChild = rightChild;
        this.value = value;
    }
}

实现

//求二叉树节点个数
public static int getNodeNum(Node root){
    if(root==null)
        return 0;
    return getNodeNum(root.leftChild)+getNodeNum(root.rightChild)+1;
}
//求二叉树的深度
public static int getDepth(Node root){
    if(root==null)
        return 0;
    int leftDepth = getDepth(root.leftChild);
    int rightDepth = getDepth(root.rightChild);
    return leftDepth>=rightDepth?leftDepth+1:rightDepth+1;
}
//前序遍历,中续遍历,后续遍历
public static void preOrderTraversal(Node root){
    if(root==null)
        return;
    System.out.print(root.value);
    preOrderTraversal(root.leftChild);
    preOrderTraversal(root.rightChild);
}
public static void inOrderTraversal(Node root){
    if(root==null)
        return;
    inOrderTraversal(root.leftChild);
    System.out.print(root.value);
    inOrderTraversal(root.rightChild);
}
public static void postOrderTraversal(Node root){
    if(root==null)
        return;
    postOrderTraversal(root.leftChild);
    postOrderTraversal(root.rightChild);
    System.out.print(root.value);
}
//分层遍历二叉树(按层次从上往下,从左往右)
public static void levelTraversal(Node root){
    if(root==null)
        return;
    LinkedList<Node> ll = new LinkedList<Node>();
    ll.offer(root);
    while(!ll.isEmpty()){
        root=ll.poll();
        System.out.println(root.value);
        if(root.leftChild!=null)
            ll.offer(root.leftChild);
        if(root.rightChild!=null)
            ll.offer(root.rightChild);
    }
}
//二叉查找树变为有序的双向链表
static LinkedList<Node> ll=new LinkedList<Node>();
public static LinkedList<Node>  binarySearchTreetoDoubleEndList(Node node){
    if(node==null)
        return null;
    binarySearchTreetoDoubleEndList(node.leftChild);
    ll.offer(node);
    binarySearchTreetoDoubleEndList(node.rightChild);
    return ll;
}
//求二叉树第K层的节点个数
public static int getNodeNumkthLevel(Node root,int k){
    if(root==null)
        return 0;
    if(root.leftChild==null&&root.rightChild==null) //if(k==1)
        return 1;
    int leftNum=getNodeNumkthLevel(root.leftChild,k-1);
    int rightNum=getNodeNumkthLevel(root.rightChild,k-1);
    return leftNum+rightNum;
}
//求二叉树中叶子节点的个数
public static int getleafNodeNum(Node root){
    if(root==null)
        return 0;
    if(root.leftChild==null&&root.rightChild==null)
        return 1;
    int leftNum=getleafNodeNum(root.leftChild);
    int rightNum=getleafNodeNum(root.rightChild);
    return leftNum+rightNum;
}
//判断两棵二叉树是否结构相同
public static boolean isSameTree(Node n1,Node n2){
    if(n1==null&&n2==null)
        return true;
    if(n1==null||n2==null)
        return false;
    boolean l = isSameTree(n1.leftChild,n2.leftChild);
    boolean r = isSameTree(n1.rightChild,n2.rightChild);
    return l&&r;
}
//判断二叉树是不是平衡二叉树
public static boolean isBalanceTree(Node root){
    if(Math.abs(getDepth(root.leftChild)-getDepth(root.rightChild))>1)
        return false;
    if(Math.abs(getDepth(root.leftChild)-getDepth(root.rightChild))<1)
        return true;
    boolean l = isBalanceTree(root.leftChild);
    boolean r = isBalanceTree(root.rightChild);
    return l&&r;
}
//判断二叉树是不是完全二叉树
public static boolean isCompleteTree(Node root){
    if(root.leftChild==null&&root.rightChild==null)
        return true;
    if(root.leftChild==null||root.rightChild==null)
        return false;
    boolean l = isCompleteTree(root.leftChild);
    boolean r = isCompleteTree(root.rightChild);
    return l&&r;
}

  

时间: 2024-10-10 13:53:09

javase(3)_二叉树的相关文章

数据结构课程设计题目四_二叉树

本文出自:http://blog.csdn.net/svitter 题目4:二叉树 给出一颗无线的二叉树.树的每一个结点用一整数对标识.二叉树构造如下 树根被标识为(1, 1): 如果一个结点被标识为(a, b), 则其左孩子被标识为(a+b,b),右孩子被标识为(a, a+b).现在给出某一结点(a, b),求树根到该结点的最短路径,并且同时求出从树根出发向左走和向右走的次数.建议完成人数1人. 注:此处使用了STL_stack库函数,是不允许的,我图方便. //===============

数据结构_二叉树后序遍历

/* 后序遍历二叉树 思路: 1,若当前结点没有左右孩子,则访问并出栈 2,若当前结点有左孩子或右孩子,并且孩子被访问过,则访问并出栈(若当前结点有左右孩子,只要有一个孩子已被访问,那么它的两个孩子都已被访问,这与入栈顺序有关,它的孩子在栈中一定在它的上方) 3,若当前结点有左孩子或右孩子,并且都没有被访问,那么先将右孩子入栈,再将左孩子入栈 */ void beh_Order(BiTree T) { InitStack(S); BiTree pCur,pPre=NULL,p; Push(s,T

[javaSE] 数据结构(二叉树-遍历与查找)

前序遍历:中,左,右 中序遍历:左,中,右 后序遍历:左,右,中 二叉树查找 从根节点进行比较,目标比根节点小,指针移动到左边 从根节点进行比较,目标比根节点大,指针移动到右边 /** * 前序遍历 * @param tree */ public void preOrder(BSTree tree){ preOrder(tree.mRoot); } public void preOrder(BSTNode node){ if(node!=null){ System.out.print(node.

数据结构笔记_二叉树的性质

二叉树的性质: 性质1.在二叉树第i层上至多有2^(i-1)个结点(i>=1). 性质2.深度为k的二叉树上至多含2^(k)-1个结点(k>=1). 性质3.对任何一颗二叉树,若它含有n0个叶子结点,n2个度为2的结点,则必存在关系式n0=n2+1. 证明: 设二叉树上的结点总数为n,则n=n0+n1+n2,其中n1为度为1的结点数. 又二叉树上分支总数b=n1+2*n2; 而b=n-1(因为除根结点外,每个结点都有一个指向它的分支)=n0+n1+n2-1,由此,n0=n2+1: 两类特殊二叉

数据结构_二叉树先序遍历

/* 二叉树先序遍历 思路: 1,先访问当前结点,将其入栈(其可能有右孩子) 2,若其存在左结点,执行1 3,若不存在左结点,则将栈顶元素出栈,若其不存在右孩子,继续出栈,若有右孩子,执行1 */ void pre_Order(BTree T) { InitStack(S); BiTree pCur=T; while(pCur || !IsEmpty(S)) //这里的IsEmpty好像不需要 { visit(pCur); Push(S,pCur); pCur = pCur->lchild; w

数据结构基础_二叉树

二叉树 二叉树(Binary Tree)的递归定义:二叉树要么为空,要么由根节点(root).左子树(left subtree)和右子树(right subtree)组成. 小球落下 题目:一棵二叉树,初始开关关闭.当小球到达一个内节点时,如果该节点上的开关关闭,则往左走,否则往右走,直到走到叶结点. 输入: 4 2 3 4 10 1 2 2 8 128 16 12345 输出: 12 7 512 3 255 36358 思路:只需看小球的编号的奇偶性,就能知道它是最终在哪棵树中.对于那些落入根

javase(5)_面向对象

一.概述 1.面向对象是一种思想,让我们由执行者变成指挥者,执行者是面向过程,指挥者是面向对象.例如人开冰箱门,开冰箱门这个动作应该属于门而不是人,冰箱自己最清楚门应该怎么开,人只是调用了冰箱的这个动作. 2.面向对象开发例子 1.电脑坏了,找个修电脑的人,我们调用修电脑这个人修电脑的功能即可,自己不需要知道具体怎么修;2.公司老板找人完成软件开发... 3.开发的时候先想是否java已经实现了这个功能,找这个对象拿过来用,如果没有,自己造一个对象来用,自己能用别人也能用,开发就是找对象,找不到

1 数据结构(13)_二叉树的概念及常用操作实现

1. 树到二叉树的转换 思考:通用树结构的实现太过复杂(树中每个结点都可以有任意多的孩子,具有多种形态),工程中很少会用到如此复杂的树是否可以简化呢?思路:减少树结点中孩子的数量.但这样树是否还能通用呢? 1.1.树的两种表示法 双亲孩子表示法:孩子兄弟表示法:孩子兄弟表示法的特点:1.能够表示任意的树形结构2.每个结点包含一个数据成员和两个指针成员3.孩子结点指针和兄弟结点指针构成"树杈" 2.2.二叉树 二叉树是由n(n>=0)个节点组成的有限集合,该集合或者为空,或者是由一

数据结构_二叉树Ⅲ——堆与优先队列

堆(Heap) 堆是一种完全二叉树,只是是用数组的形式表示二叉树而已 它其实是利用完全二叉树的结构来维护一组数据 例如这样一棵完全二叉树: 它用堆的形式表现就是这样的: 当然,一般的堆每个元素都是数字呢(不然小根堆与大根堆就没办法实现了呢) 大根堆与小根堆 顾名思义,大根堆/小根堆就是保证根节点是所有数据中最大/小,并且尽力让小的节点在上方 例如下面这个二叉树就是一个小根堆呢 (借鉴某书图片) 那如何将任意一个堆调整至大根堆/小根堆呢? 从上向下调整 让当前结点与它的左右孩子进行比较,哪个比较小