zoukankan      html  css  js  c++  java
  • java数据结构和算法------二叉树基本操作

      1 package iYou.neugle.tree;
      2 
      3 import java.util.ArrayList;
      4 import java.util.List;
      5 
      6 public class Binary_Tree<T> {
      7     private Tree tree = new Tree();
      8 
      9     class Tree {
     10         public T data;
     11         public Tree left;
     12         public Tree right;
     13     }
     14 
     15     public enum Direction {
     16         left, right
     17     }
     18 
     19     // 生成根节点
     20     public void CreateRoot(T data) {
     21         this.tree.data = data;
     22     }
     23 
     24     // 插入节点到指定位置
     25     public boolean Insert(T parentData, T data, Direction direction) {
     26         if (this.TreeIsEmpty()) {
     27             System.out.println("树暂无节点,请先创建树");
     28             return false;
     29         }
     30         return this.InsertNode(this.tree, parentData, data, direction);
     31     }
     32 
     33     private boolean InsertNode(Tree TreeNode, T parentData, T data,
     34             Direction direction) {
     35         if (TreeNode == null) {
     36             return false;
     37         }
     38         if (TreeNode.data.equals(parentData)) {
     39             Tree t = new Tree();
     40             t.data = data;
     41             if (direction == Direction.left) {
     42                 if (TreeNode.left == null) {
     43                     TreeNode.left = t;
     44                     return true;
     45                 } else {
     46                     System.out.println("该节点的左节点不为空!");
     47                 }
     48             } else {
     49                 if (TreeNode.right == null) {
     50                     TreeNode.right = t;
     51                     return true;
     52                 } else {
     53                     System.out.println("该节点的右节点不为空!");
     54                 }
     55             }
     56             return false;
     57         }
     58 
     59         boolean b = InsertNode(TreeNode.left, parentData, data, direction);
     60 
     61         if (!b) {
     62             return InsertNode(TreeNode.right, parentData, data, direction);
     63         } else {
     64             return b;
     65         }
     66 
     67     }
     68 
     69     // 获取二叉树深度
     70     public int Deep() {
     71         return this.TreeDeep(this.tree);
     72     }
     73 
     74     private int TreeDeep(Tree tree) {
     75         int leftLen = 0;
     76         int rightLen = 0;
     77         if (tree == null) {
     78             return 0;
     79         }
     80         leftLen = this.TreeDeep(tree.left);
     81         rightLen = this.TreeDeep(tree.right);
     82         if (leftLen > rightLen) {
     83             return leftLen + 1;
     84         } else {
     85             return rightLen + 1;
     86         }
     87     }
     88 
     89     // 判断二叉树是否为空
     90     public boolean TreeIsEmpty() {
     91         if (this.tree.data != null) {
     92             return false;
     93         }
     94         return true;
     95     }
     96 
     97     // 根据值查找节点
     98     public Tree Query(T data) {
     99         return QueryTreeByValue(this.tree, data);
    100     }
    101 
    102     private Tree QueryTreeByValue(Tree tree, T data) {
    103         if (tree == null) {
    104             return null;
    105         }
    106         if (tree.data.equals(data)) {
    107             System.out.println("----------");
    108             System.out.println("查找到该节点,节点左子树为:"
    109                     + (tree.left == null ? "无" : tree.left.data));
    110             System.out.println("查找到该节点,节点右子树为:"
    111                     + (tree.right == null ? "无" : tree.right.data));
    112             System.out.println("----------");
    113             return tree;
    114         }
    115         Tree t = QueryTreeByValue(tree.left, data);
    116         if (t == null) {
    117             return QueryTreeByValue(tree.right, data);
    118         } else {
    119             return t;
    120         }
    121     }
    122 
    123     // 清空二叉树
    124     public void ClearTree() {
    125         this.tree = null;
    126     }
    127 
    128     // 先序遍历
    129     public void DLR() {
    130         this.Tree_DLR(this.tree);
    131     }
    132 
    133     private void Tree_DLR(Tree tree) {
    134         if (tree == null) {
    135             return;
    136         }
    137         System.out.println(tree.data);
    138         this.Tree_DLR(tree.left);
    139         this.Tree_DLR(tree.right);
    140     }
    141 
    142     // 中序遍历
    143     public void LDR() {
    144         this.Tree_LDR(this.tree);
    145     }
    146 
    147     private void Tree_LDR(Tree tree) {
    148         if (tree == null) {
    149             return;
    150         }
    151         this.Tree_LDR(tree.left);
    152         System.out.println(tree.data);
    153         this.Tree_LDR(tree.right);
    154     }
    155 
    156     // 后序遍历
    157     public void LRD() {
    158         this.Tree_LRD(this.tree);
    159     }
    160 
    161     private void Tree_LRD(Tree tree) {
    162         if (tree == null) {
    163             return;
    164         }
    165         this.Tree_LRD(tree.left);
    166         this.Tree_LRD(tree.right);
    167         System.out.println(tree.data);
    168     }
    169 
    170     // 层次遍历
    171     public void Level() {
    172         List<Tree> list = new ArrayList<Tree>();
    173         list.add(this.tree);
    174         while (!list.isEmpty()) {
    175             Tree left = list.get(0).left;
    176             Tree right = list.get(0).right;
    177             if (left != null) {
    178                 list.add(left);
    179             }
    180             if (right != null) {
    181                 list.add(right);
    182             }
    183             System.out.println(list.get(0).data);
    184             list.remove(0);
    185         }
    186     }
    187 }
  • 相关阅读:
    codevs 5964 [SDOI2017]序列计数
    codevs 5963 [SDOI2017]树点染色
    【opencv】c++ 读取图片 & 绘制点 & 绘制文字 & 保存图片
    【opencv安裝】opencv2和opencv3共存——安装opencv2和opencv3到指定目录
    【opencv】cv::Mat_ 对单个元素赋值
    【opencv】projectPoints 三维点到二维点 重投影误差计算
    【opencv】cv::Mat转std::vector<cv::Point2d> (注意两容器中数据类型的一致性)
    高斯分布抽样
    射影变换、仿射变换、欧式变换、相似变换、等距变换
    【opencv】 solvepnp 和 solvepnpRansac 求解 【空间三维坐标系 到 图像二维坐标系】的 三维旋转R 和 三维平移 T 【opencv2使用solvepnp求解rt不准的问题】
  • 原文地址:https://www.cnblogs.com/niuxiaoha/p/4643136.html
Copyright © 2011-2022 走看看