JAVA实现二叉树结构

  • 二叉树结构,除了根节点没有父亲,可能存在左孩子和右孩子节点。

 
 
  1. public class TreeNode<T> {
  2. // 树的节点对象
  3. private int index;
  4. private T data;
  5. TreeNode<T> leftChild;// 左孩子节点
  6. TreeNode<T> rightChild;// 右孩子节点
  7. public TreeNode(T t) {
  8. this.data = t;
  9. }
  10. public TreeNode(int index, T t) {
  11. this.index = index;
  12. this.data = t;
  13. }
  14. public TreeNode(int index,T t,TreeNode<T> leftChild,TreeNode<T> rightChild){
  15. this.index = index;
  16. this.data = t;
  17. this.leftChild = leftChild;
  18. this.rightChild = rightChild;
  19. }
  20. public int getIndex() {
  21. return index;
  22. }
  23. public void setIndex(int index) {
  24. this.index = index;
  25. }
  26. public T getData() {
  27. return data;
  28. }
  29. public void setData(T data) {
  30. this.data = data;
  31. }
  32. public TreeNode<T> getLeftChild() {
  33. return leftChild;
  34. }
  35. public void setLeftChild(TreeNode<T> leftChild) {
  36. this.leftChild = leftChild;
  37. }
  38. public TreeNode<T> getRightChild() {
  39. return rightChild;
  40. }
  41. public void setRightChild(TreeNode<T> rightChild) {
  42. this.rightChild = rightChild;
  43. }
  44. }

   /**

  1. * 代码实现树结构:树的创建,树的深度,树的节点树,树的排序(前序,中序,后序),栈的方式实现树的前序遍历
  2. *
  3. * @author timmy1
  4. *
  5. */
  6. public class MyTree<T> {
  7. private TreeNode<String> root;// 根节点
  8. public MyTree() {
  9. // root = new TreeNode<String>(0, "A");
  10. }
  11. // ----------------A
  12. // ----------B---------C
  13. // ------D------E----------F
  14. // 创建二叉树 前序遍历:ABDECF 中序遍历:DBEACF
  15. public void createTree() {
  16. TreeNode<String> nodeB = new TreeNode<String>(1, "B");
  17. TreeNode<String> nodeC = new TreeNode<String>(2, "C");
  18. TreeNode<String> nodeD = new TreeNode<String>(3, "D");
  19. TreeNode<String> nodeE = new TreeNode<String>(4, "E");
  20. TreeNode<String> nodeF = new TreeNode<String>(5, "F");
  21. root.leftChild = nodeB;
  22. root.rightChild = nodeC;
  23. nodeB.leftChild = nodeD;
  24. nodeB.rightChild = nodeE;
  25. nodeC.rightChild = nodeF;
  26. }
  27. /**
  28. * 获取树的深度
  29. *
  30. * @return
  31. */
  32. public int getTreeHeight() {
  33. return getTreeHeight(root);
  34. }
  35. private int getTreeHeight(TreeNode<String> node) {
  36. if (node == null) {
  37. return 0;
  38. } else {
  39. int i = getTreeHeight(node.leftChild);
  40. int j = getTreeHeight(node.rightChild);
  41. return 1 + (i > j ? i : j);
  42. }
  43. }
  44. /**
  45. * 获取树的节点个数
  46. *
  47. * @return
  48. */
  49. public int getTreeSize() {
  50. return getTreeSize(root);
  51. }
  52. private int getTreeSize(TreeNode<String> node) {
  53. if (node == null) {
  54. return 0;
  55. } else {
  56. return 1 + getTreeSize(node.leftChild) + getTreeSize(node.rightChild);
  57. }
  58. }
  59. private void preTraversal() {
  60. TreeUtil.preTraversal(root);
  61. }
  62. /**
  63. * 使用栈的方式实现前序遍历
  64. */
  65. public void preByStack() {
  66. MyStack<TreeNode<String>> stack = new MyStack<>();
  67. stack.push(root);
  68. while (stack.size() != 0) {
  69. TreeNode<String> node = stack.peek();
  70. PrintUtil.print("traversal stack:" + node.getData());
  71. // 出栈
  72. stack.pop();
  73. // 右孩子先入栈--》左孩子入栈
  74. if (node.rightChild != null) {
  75. stack.push(node.rightChild);
  76. }
  77. if (node.leftChild != null) {
  78. stack.push(node.leftChild);
  79. }
  80. }
  81. }
  82. /**
  83. * 使用栈的方式实现中序遍历
  84. */
  85. public void midByStack() {
  86. MyStack<TreeNode<String>> stack = new MyStack<>();
  87. stack.push(root);
  88. while (stack.size() != 0) {
  89. TreeNode<String> node = stack.peek();
  90. // 全部左边的节点保存后取出来
  91. while (node.leftChild != null) {
  92. node = node.leftChild;
  93. stack.push(node);
  94. }
  95. // 左边孩子节点出栈
  96. if (stack.size() > 1) {// 说明有左孩子,左边孩子节点往外面出栈
  97. PrintUtil.print("traversal stack:" + stack.peek().getData());
  98. stack.pop();
  99. }
  100. // 中间节点出栈
  101. TreeNode<String> midNode = stack.peek();
  102. if (midNode != null) {
  103. PrintUtil.print("traversal stack:" + midNode.getData());
  104. stack.pop();
  105. }
  106. // 右边孩子入栈
  107. if (midNode != null && midNode.rightChild != null)
  108. stack.push(midNode.rightChild);
  109. }
  110. }
  111. // ----------------A
  112. // ----------B---------C
  113. // ------D------E----#-----F
  114. // ---#----#---#--#------#---#
  115. // ABD##E##C#F##
  116. //
  117. /**
  118. * 根据已经前序遍历好的字符串list,创建二叉树
  119. */
  120. public TreeNode<String> createBinaryTreeByPreTraversal(List<String> list) {
  121. if (list.size() == 0)
  122. return null;
  123. String data = list.get(0);
  124. if (data.equals("#")) {
  125. list.remove(0);
  126. return null;
  127. }
  128. TreeNode<String> node = new TreeNode<String>(list.size(), data);
  129. if (root == null) {
  130. root = node;
  131. }
  132. list.remove(0);
  133. node.leftChild = createBinaryTreeByPreTraversal(list);
  134. node.rightChild = createBinaryTreeByPreTraversal(list);
  135. return node;
  136. }
  137. public static void main(String[] args) {
  138. MyTree<String> tree = new MyTree<>();
  139. // tree.createTree();
  140. // int height = tree.getTreeHeight();
  141. // PrintUtil.print("tree height:" + height);
  142. // PrintUtil.print("tree size:" + tree.getTreeSize());
  143. // // tree.preTraversal();
  144. // tree.midByStack();
  145. String str = "ABD##E##C#F##";
  146. char[] charArr = str.toCharArray();
  147. List<String> data = new ArrayList<String>();
  148. for (char c : charArr) {
  149. data.add(c + "");
  150. }
  151. tree.createBinaryTreeByPreTraversal(data);
  152. tree.preTraversal();
  153. }
  154. }
  
  
  1. public class TreeUtil {
  2. /**
  3. * 迭代方式,前序遍历树节点
  4. *
  5. * @param node
  6. */
  7. public static void preTraversal(TreeNode<?> node) {
  8. if (node == null) {
  9. return;
  10. }
  11. PrintUtil.print("pre Traversal:" + node.getData());
  12. preTraversal(node.leftChild);
  13. preTraversal(node.rightChild);
  14. }
  15. public static void midTraversal(TreeNode<?> node) {
  16. if (node == null) {
  17. return;
  18. }
  19. midTraversal(node.leftChild);
  20. PrintUtil.print("pre Traversal:" + node.getData());
  21. midTraversal(node.rightChild);
  22. }
  23. public static void nextTraversal(TreeNode<?> node) {
  24. if (node == null) {
  25. return;
  26. }
  27. midTraversal(node.leftChild);
  28. midTraversal(node.rightChild);
  29. PrintUtil.print("pre Traversal:" + node.getData());
  30. }
  31. }



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值