二叉樹的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 }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM