zoukankan      html  css  js  c++  java
  • java

    一.遍历

    设L、D、R分别表示遍历左子树、访问根结点和遍历右子树, 则对一棵二叉树的遍历有三种情况:DLR(称为先根次序遍历),LDR(称为中根次序遍历),LRD (称为后根次序遍历)。

    1.先序遍历:首先访问根,再先序遍历左子树,最后先序遍历右子树。

    2.中序遍历:首先中序遍历左子树,再访问根,最后中序遍历右子树。

    3.后序便利:首先后序遍历左子树,再后序遍历右子树,最后访问根。

    二.二叉树的字符串表达式

    String  expression = "A(B(D(,G)),C(E,F))";与该广义表对应的二叉树为:

    写代码前,我们通过观察二叉树和广义表,先得出一些结论:

    • 每当遇到字母,将要创建节点
    • 每当遇到“(”,表面要创建左孩子节点
    • 每当遇到“,”,表明要创建又孩子节点
    • 每当遇到“)”,表明要返回上一层节点
    • 广义表中“(”的数量正好是二叉树的层数

    三.代码

    1.树的每个节点

     1 public class Node {
     2     //节点的数据
     3     private char data;
     4     //节点的左子节点
     5     private Node lchild;
     6     //节点的右子节点
     7     private Node rchild;
     8     
     9     public Node() {
    10         super();
    11     }
    12 
    13     public Node(char data, Node lchild, Node rchild) {
    14         super();
    15         this.data = data;
    16         this.lchild = lchild;
    17         this.rchild = rchild;
    18     }
    19 
    20     public char getData() {
    21         return data;
    22     }
    23 
    24     public void setData(char data) {
    25         this.data = data;
    26     }
    27 
    28     public Node getLchild() {
    29         return lchild;
    30     }
    31 
    32     public void setLchild(Node lchild) {
    33         this.lchild = lchild;
    34     }
    35 
    36     public Node getRchild() {
    37         return rchild;
    38     }
    39 
    40     public void setRchild(Node rchild) {
    41         this.rchild = rchild;
    42     }
    43     
    44     public String toString(){
    45         return ""+getData();
    46     }
    47     
    48 }

    2.二叉树

      1 /**
      2  * 二叉树,包含有创建二叉树,遍历二叉树的方法
      3  * @author phase1
      4  *
      5  */
      6 public class BinaryTree {
      7     //二叉树的字符串表达式
      8     private String tree; 
      9     //树的节点表式
     10     private Node treeNode;
     11     //构造方法
     12     public BinaryTree(String tree){
     13         this.tree = tree;
     14     }
     15     public BinaryTree(Node treeNode){
     16         this.treeNode = treeNode;
     17     }
     18     public String getTree() {
     19         return tree;
     20     }
     21     public void setTree(String tree) {
     22         this.tree = tree;
     23     }
     24     public Node getTreeNode() {
     25         return treeNode;
     26     }
     27     public void setTreeNode(Node treeNode) {
     28         this.treeNode = treeNode;
     29     }
     30     
     31     /**
     32      * 根据二叉树的字符串表式创建二叉树的节点表示法
     33      * @return
     34      */
     35     public Node createTree(){
     36         //将树的字符串表示转换成char数组
     37         char[] data = tree.toCharArray();
     38         //根节点,有了根节点所有节点都能获取
     39         Node root = null;
     40         //用于存放每一层的根节点,值动态的
     41         List<Node> nodes = new LinkedList<Node>();
     42         int level = -1;
     43         //控制创建左右子节点(L,R)
     44         char child = 'N';
     45         //当前节点
     46         Node now = null;
     47         for(int i=0;i<data.length;i++){
     48             switch(data[i]){
     49             case '(':
     50                 level++;
     51                 //此时nodes.get(level)与now对应
     52                 nodes.add(now);
     53                 child = 'L';
     54                 break;
     55             case ',':
     56                 child = 'R';
     57                 break;
     58             case ')':
     59                 nodes.remove(level);
     60                 level--;
     61                 break;
     62             default:
     63                 now = new Node(data[i], null, null);
     64                 if(root == null){
     65                     root = now;
     66                 }else{
     67                     switch(child){//此时nodes.get(leve)为now的父节点
     68                     case 'L':
     69                         nodes.get(level).setLchild(now);
     70                         break;
     71                     case 'R':
     72                         nodes.get(level).setRchild(now);
     73                     }
     74                 }
     75             }
     76                 
     77         }
     78         return root;
     79     }
     80     
     81     /**
     82      * 先序遍历
     83      * @param node
     84      */
     85     public String beforeOrder(Node node){
     86         StringBuilder nodes = new StringBuilder();
     87         if(node != null){
     88             //根节点
     89             nodes.append(node.getData());
     90             //先序遍历左子节点
     91             nodes.append(beforeOrder(node.getLchild()));
     92             //先序遍历右子节点
     93             nodes.append(beforeOrder(node.getRchild()));
     94         }
     95         return nodes.toString();
     96     }
     97     
     98     /**
     99      * 中序遍历
    100      * @param node
    101      */
    102     public String inOrder(Node node){
    103         StringBuilder nodes = new StringBuilder();
    104         if(node != null){
    105             //中序遍历左子节点
    106             nodes.append(inOrder(node.getLchild()));
    107             //根节点
    108             nodes.append(node.getData());
    109             //中序遍历右子节点
    110             nodes.append(inOrder(node.getRchild()));
    111         }
    112         return nodes.toString();
    113     }
    114     
    115     /**
    116      * 后序遍历
    117      * @param node
    118      */
    119     public String afterOrder(Node node){
    120         StringBuilder nodes = new StringBuilder();
    121         if(node != null){
    122             //后序遍历左子节点
    123             nodes.append(afterOrder(node.getLchild()));
    124             //后序遍历右子节点
    125             nodes.append(afterOrder(node.getRchild()));
    126             //根节点
    127             nodes.append((node.getData()));
    128         }
    129         return nodes.toString();
    130     }
    131     
    132     public static void main(String[] args) {
    133         String  expression = "A(B(D(,G)),C(E,F))";
    134         BinaryTree tree = new BinaryTree(expression);
    135         Node node = tree.createTree();
    136         System.out.println(tree.beforeOrder(node));//ABDGCEF
    137         System.out.println(tree.inOrder(node));  //DGBAECF
    138         System.out.println(tree.afterOrder(node));//GDBEFCA
    139     }
    140 }
  • 相关阅读:
    (1)定义一个接口Compute含有一个方法int computer(int n,int m); (2)设计四个类分别实现此接口,完成+-*/运算 (3)设计一个类UseCompute,含有方法: public void useCom(Compute com, int one, int two) (4)设计一个测试类
    定义一个“点”(Point)类用来表示三维空间中的点(有三个坐标)。要求如下: (1)可以生成具有特定坐标的点对象。 (2)提供可以设置三个坐标的方法。 (3)提供可以计算该“点”距原点距离平方的方法。 (4)编写主类程序验证。
    编写一个Java程序,计算半径为3.0的圆周长和面积并输出结果
    Java泛型详解
    面向对象
    随机数
    随机数的产生
    随机数
    matplotlib 绘图实例01:正弦余弦曲线
    第05课 Linux命令初探(一)
  • 原文地址:https://www.cnblogs.com/fenglanglang/p/5985338.html
Copyright © 2011-2022 走看看