二叉树相关问题(JAVA实现)

原创 2017年01月03日 11:51:11
二叉树(Binarry Tree)是n(n大于等于0)个数据元素的有限集,它或为空集(n=0),或者有唯一的根的元素,且其余元素分成两个互不相交的子集,每个子集自身也是一棵二叉树,分别称为左子树和右子树。(二叉树中的左子树和右子树是两棵互不相交的二叉树)。
二叉树中其左,右子树均为空的结点称为叶子结点,所有非叶子结点称为分支结点。二叉树中叶子结点的最大层次数定义为二叉树的深度。
满二叉树:二叉树中所有的分支结点的度数都为2,且叶子结点都在同一层次;

二叉树的基本性质:
(1). 在二叉树的第 i 层上至多有 2^(i-1) 个结点(i 大于等于1);
(2). 深度为 k 的二叉树 至多有 2^k -1 个结点 (k 大于等于1);
(3). 对任何一棵树 T,如果其终端结点电数为No ,度为2 的结点数为N2  ,则No=N2+1  ;

结点定义:
class TreeNode
{
      boolean visited =false;
      int data;
      TreeNode left;
      TreeNode right;
}
主函数:
 public static void main(String[] args)
{
 
  TreeNode root = new TreeNode();
  root.data = 9;

  TreeNode temp01 = new TreeNode();
  temp01.data = 2;
  root.left = temp01;

  TreeNode temp02 = new TreeNode();
  temp02.data = 5;
  root.right = temp02;

  TreeNode temp03 = new TreeNode();
  temp03.data = 1;
  root.left.left = temp03;

  TreeNode temp04 = new TreeNode();
  temp04.data = 4;
  root.left.right = temp04;

  TreeNode temp05 = new TreeNode();
  temp05.data = 7;
  root.right.left = temp05;

  TreeNode temp06 = new TreeNode();
  temp06.data = 8;
  root.left.left.left = temp06;

  TreeNode temp07 = new TreeNode();
  temp07.data = 3;
  root.left.left.right = temp07;
 
 System.out.println("--------先序遍历----------");
  PreSelectTree1(root);
  System.out.println();
  System.out.println("---------中序遍历---------");
  InSelectTree(root);
  System.out.println();
  System.out.println("---------后序遍历---------");
  SelectTree2(root);
  System.out.println();
  System.out.println("----------叶节点个数-----------");
  int i = leafNum(root);
  System.out.println(i);
  System.out.println("----------层次遍历二叉树-----------------");
  levelOrder(root);
  System.out.println();
  int n=getNodeNum(root);
  System.out.println("---------结点个数-------");
  System.out.println(n);
  
  System.out.println();
  int H=getDepth(root);
  System.out.println("---------深度---------");
  System.out.println(H);
  System.out.println();

}
 
// 二叉树遍历
(1). 中序遍历
a.如果二叉树为空,则为空操作;
b.如果二叉树不为空,则中序遍历,先遍历左子树,再访问根结点,最后遍历右子树;
 public static void InSelectTree(TreeNode root)
{
      if (root == null)
          return ;
        SelectTree(root.left);
        System.out.print(root.data + " ");
        SelectTree(root.right);
 }
 (2) . 先序遍历
a. 如果二叉树为空,则为空操作;
b. 如果二叉树不为空,则先序遍历,先访问根结点,再遍历左子树,最后遍历有右子树;
public static void PreSelectTree(TreeNode root) {
  if (root == null)
   return;
  System.out.print(root.data + " ");
  SelectTree1(root.left);
  SelectTree1(root.right);
 }
(3).后序遍历
a.如果二叉树为空,则为空操作;
b.如果二叉树不为空,则后序遍历,先遍历左子树,再遍历右子树,最后访问根节点。
public static void SelectTree(TreeNode root)
{
    if (root == null)
              return;
      SelectTree(root.left);
      SelectTree(root.right);
      System.out.print(root.data + " ");
}
(4). 层次遍历(从上往下,从左往右)
a.使用队列实现遍历;首先对队列进行初始化,将根结点送入队列中;
b.当队列不为空时,从队列中退出一个结点,若左孩子不为空,访问左孩子,则将左孩子入队列,再访问其右孩子;
 public static void levelOrder(TreeNode node)
 {
     if (node == null)
          return;
       Queue<TreeNode> queue = new ArrayDeque<TreeNode>();
       queue.add(node);
     while (!queue.isEmpty())
        {
            TreeNode temp = queue.poll();
            System.out.print(temp.data+" ");
            if (temp.left != null)
            queue.add(temp.left);
            if (temp.right != null)
            queue.add(temp.right);
       }
 }
//二叉树结点个数
a.如果二叉树为空,则结点个数为0;
b.如果二叉树不为空,则结点个数为左子树结点个数+右子树结点个数;
在这我使用的是递归的方法;
  public static int getNodeNum(TreeNode node)
  {
      if(node==null)
       {
           return 0;
       }
           else
      {
          return getNodeNum(node.left)+getNodeNum(node.right)+1;
      }
  }
//二叉树深度
a.如果二叉树为空,则二叉树深度为0;
b.如果二叉树不为空,则求取二叉树左子树深度和右子树深度,那个字树的深度深,则为二叉树的深度;
  public static int getDepth(TreeNode node)
  {
       int DepthL,DepthR;
      if(node==null)
            return 0;
      else
            DepthL=getDepth(node.left);
            DepthR=getDepth(node.right);
            return (DepthL<DepthR)? (DepthR+1):(DepthL+1);
  }



 
版权声明:本文为博主原创文章,未经博主允许不得转载。

Java实现二叉树的相关操作

  • 2015年08月22日 17:05
  • 7KB
  • 下载

二叉树相关问题编程实现(1)

二叉树相关问题编程实现
  • jbctcx
  • jbctcx
  • 2016年09月23日 19:17
  • 157

Java实现二叉树及相关遍历方式

Java实现二叉树及相关遍历方式 在计算机科学中,二叉树是每个节点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。 二叉树常被...
  • qiu_11
  • qiu_11
  • 2015年04月02日 12:17
  • 3568

用java实现二叉树相关操作(前序建树,前中后递归非递归遍历,层序遍历)

java实现二叉树相关操作,欢迎讨论

二叉树、二叉排序树及相关遍历java实现

二叉树与二叉排序树在面试过程中经常被问到,本组程序利用java实现相关的定义与操作;一方面方便自己复习,另一方面分享给大家参考,欢迎交流指正!...

二叉树的相关问题

1.遍历 如二叉树:a+b*(c-d)-e/f                       -            +                   /      a         ...
  • drf1234
  • drf1234
  • 2011年11月08日 18:05
  • 196

二叉树的深度相关问题

题目 输入一颗二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的结点形成树的一条路径,最长路径的长度为树的深度。 思路 简化一下题目,思考一个节点的时候二叉树的深度为 1,因为左右...

Algorithms(二)---二叉树的相关问题

声明本文中所用的二叉树的节点结构定义如下:class Node { private Node left; private Node right; private int data...

数据结构之二叉树相关问题汇总

版权所有,转载请注明出处,谢谢! http://blog.csdn.net/walkinginthewind/article/details/7518888 树是一种比较重要的数据结构,尤...
  • coloriy
  • coloriy
  • 2015年02月06日 14:31
  • 343

二叉树的相关程序 Java

二叉树的先序遍历,中序遍历,后序遍历 输出单层节点、检查是否为BST、中序遍历寻找下一个节点 import java.util.ArrayList; import java.util.S...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:二叉树相关问题(JAVA实现)
举报原因:
原因补充:

(最多只允许输入30个字)