• 二叉树的java实现


    一、分析

      一个二叉树节点有三个部分,一个是指向左子树的部分,一个是指向右子树的部分,另外一个是数据部分。可以把这个节点抽象成一个节点对象,给对象有两个节点对象属性和一个数据属性。如下图:

      一个二叉树有只有一个根节点,其余的都是根节点的直接或间接子节点。所以可以把二叉树抽象成一个对象,该对象有一个节点类型的数据,也就是用来保存根节点。如下图:

    二、代码

      1 package com.algorithms.treee;
      2 
      3 /**
      4  * 二叉树
      5  */
      6 public class BinaryTree
      7 {
      8     private TreeNode root;// 根节点
      9 
     10     public BinaryTree()
     11     {
     12     }
     13 
     14     public BinaryTree(TreeNode root)
     15     {
     16         this.root = root;
     17     }
     18 
     19     public TreeNode getRoot()
     20     {
     21         return root;
     22     }
     23 
     24     public void setRoot(TreeNode root)
     25     {
     26         this.root = root;
     27     }
     28 
     29     /**
     30      * 定义节点
     31      */
     32     private static class TreeNode
     33     {
     34         private String data = null;// 数据部分
     35         private TreeNode left;// 左节点的引用
     36         private TreeNode right;// 右节点的引用
     37 
     38         public TreeNode()
     39         {
     40         }
     41 
     42         public TreeNode(String data, TreeNode left, TreeNode right)
     43         {
     44             this.data = data;
     45             this.left = left;
     46             this.right = right;
     47         }
     48 
     49         public String getData()
     50         {
     51             return data;
     52         }
     53 
     54         public void setData(String data)
     55         {
     56             this.data = data;
     57         }
     58 
     59         public TreeNode getLeft()
     60         {
     61             return left;
     62         }
     63 
     64         public void setLeft(TreeNode left)
     65         {
     66             this.left = left;
     67         }
     68 
     69         public TreeNode getRight()
     70         {
     71             return right;
     72         }
     73 
     74         public void setRight(TreeNode right)
     75         {
     76             this.right = right;
     77         }
     78 
     79     }
     80 
     81     /**
     82      * 返回父结点
     83      * 
     84      * @param element
     85      * @return
     86      */
     87     public TreeNode getParent(TreeNode element)
     88     {
     89         return (root == null || root == element) ? null : parent(root, element);
     90     }
     91 
     92     public TreeNode parent(TreeNode subTree, TreeNode element)
     93     {
     94         if (subTree == null)
     95             return null;
     96         if (subTree.getLeft() == element || subTree.getRight() == element)
     97             // 返回父结点地址
     98             return subTree;
     99         TreeNode p;
    100         // 现在左子树中找,如果左子树中没有找到,才到右子树去找
    101         if ((p = parent(subTree.getLeft(), element)) != null)
    102             // 递归在左子树中搜索
    103             return p;
    104         else
    105             // 递归在右子树中搜索
    106             return parent(subTree.getRight(), element);
    107     }
    108 
    109     /**
    110      * 节点个数
    111      * 
    112      * @return
    113      */
    114     public int getSize()
    115     {
    116         return getNum(root);
    117     }
    118 
    119     private int getNum(TreeNode node)
    120     {
    121         if (node == null)
    122         {
    123             return 0;
    124         }
    125         else
    126         {
    127             int i = getNum(node.getLeft());
    128             int j = getNum(node.getRight());
    129             return j + i + 1;
    130         }
    131     }
    132 
    133     /**
    134      * 树高度
    135      * 
    136      * @return
    137      */
    138     public int getHeight()
    139     {
    140         return getHeight(root);
    141     }
    142 
    143     private int getHeight(TreeNode node)
    144     {
    145         if (node == null)
    146             return 0;// 递归结束:空树高度为0
    147         else
    148         {
    149             int i = getHeight(node.getLeft());
    150             int j = getHeight(node.getRight());
    151             return (i < j) ? (j + 1) : (i + 1);
    152         }
    153     }
    154 
    155     /**
    156      * 前序遍历
    157      * 
    158      * @param node
    159      */
    160     public void preOrder(TreeNode node)
    161     {
    162         if (node != null)
    163         {
    164             System.out.println(node.getData());
    165             preOrder(node.getLeft());
    166             preOrder(node.getRight());
    167         }
    168     }
    169 
    170     /**
    171      * 中序遍历
    172      * 
    173      * @param node
    174      */
    175     public void inOrder(TreeNode node)
    176     {
    177         if (node != null)
    178         {
    179             inOrder(node.getLeft());
    180             System.out.println(node.getData());
    181             inOrder(node.getRight());
    182         }
    183     }
    184 
    185     /**
    186      * 后续遍历
    187      * 
    188      * @param node
    189      */
    190     public void postOrder(TreeNode node)
    191     {
    192         if (node != null)
    193         {
    194             postOrder(node.getLeft());
    195             postOrder(node.getRight());
    196             System.out.println(node.getData());
    197         }
    198     }
    199 
    200     public static void main(String[] args)
    201     {
    202 
    203         TreeNode l12 = new TreeNode("left12", null, null);
    204         TreeNode r12 = new TreeNode("right12", null, null);
    205         TreeNode l22 = new TreeNode("left22", null, null);
    206         TreeNode r22 = new TreeNode("right22", null, null);
    207 
    208         TreeNode l1 = new TreeNode("left1", l12, r12);// 根节点左子树
    209         TreeNode r1 = new TreeNode("right1", l22, r22);// 根节点右子树
    210         TreeNode root = new TreeNode("root", l1, r1);// 创建根节点
    211 
    212         BinaryTree bt = new BinaryTree(root);
    213         System.out.println("=======先序遍历======");
    214         bt.preOrder(bt.getRoot());
    215         System.out.println("=======中序遍历======");
    216         bt.inOrder(bt.getRoot());
    217         System.out.println("========后续遍历=======");
    218         bt.postOrder(bt.getRoot());
    219         System.out.println("===========");
    220         System.out.println(bt.getHeight());
    221         System.out.println(bt.getSize());
    222 
    223         System.out.println(bt.getParent(r22).getData());
    224     }
    225 }
  • 相关阅读:
    DS博客作业02--线性表
    DS博客作业01--日期抽象数据类型设计与实现
    C语言博客作业06--结构体&文件
    C语言博客05--指针
    DS博客作业07--查找
    DS博客作业06--图
    DS博客作业05--树
    DS博客作业03--栈和队列
    DS博客作业02--线性表
    DS博客作业01--日期抽象数据类型设计与实验
  • 原文地址:https://www.cnblogs.com/always-online/p/3577153.html
Copyright © 2020-2023  润新知