---
tags: Java
---
# 【建樹與畫樹】
## Summary
1. 以Binary tree的方式儲存data,主要使用的object為Tree和Node.
2. 輸入方式有2種 :
(1) User 直接輸入node的值與其對應關係.
可呼叫Tree.userInput()執行
```
Tree t = new Tree();
t.userInput();
```
執行結果如下 :

(2)直接宣告Tree和Node,並賦予關係:
```
Node n1 = new Node(1);
Node n2 = new Node(2);
Node n3 = new Node(3);
n1.addLeftChild(n2);
n1.addRightChild(n3);
Tree t = new Tree(n1);
```
### Output Diagram
1. 以DFS方式先取得Tree depth.
2. 從level 0開始,將root中所有的child儲存到level 1的arraylist中.
3. 在level 1中的node裡所有的child儲存到level 2 1的arraylist中,以遞迴的方式依序列印出所有的node.在`printNodeInLevel(List<Node> nodesInLevel, int level) `中實作.

## Tree
**public class Tree**
| Public constructors |
| -------- |
| Tree() |
| Tree(Node n) |
<table><thead><tr><th colspan="2">Public methods</th><th colspan="2">Descriptiom</th></tr></thead><tbody><tr><td>int</td><td>getDepth()</td><td colspan="2">取得Tree的最大深度</td></tr><tr><td>Node</td><td>getRoot()</td><td colspan="2">取得root,回傳型態為Node</td></tr><tr><td>void</td><td>printTree()</td><td colspan="2">列印Tree的樹狀圖</td></tr><tr><td>void</td><td>userInput()</td><td colspan="2">讓User以輸入的行事建立Tree</td></tr></tbody></table>
## Node
**public class Node**
| Public constructors |
| -------- |
| Node () |
| Node (int d) |
<table><thead><tr><th colspan="2">Public methods</th><th colspan="2" rowspan="2">Descriptiom</th></tr><tr><th>Return value</th><th></th></tr></thead><tbody><tr><td>void</td><td>setData(int data)</td><td>設定node的編號(資料),型態為int</td><td></td></tr><tr><td>int</td><td>getData()</td><td colspan="2">取得node的編號(資料),return值為Node資料</td></tr><tr><td>void</td><td>addParent(Node n)</td><td colspan="2">指定Node的Parent,若無assign,getParent()則return null.</td></tr><tr><td>void</td><td>addLeftChild(Node n)</td><td colspan="2">指定Node的Left Child,若無assign,getLeftChild()則return null.</td></tr><tr><td>void</td><td>addRightChild(Node n)</td><td colspan="2">指定Node的Right Child,若無assign,getRightChild()則return null.</td></tr><tr><td>boolean</td><td>hasLeftChild()</td><td colspan="2">判斷Node是否有Left Child</td></tr><tr><td>boolean</td><td>hasRightChild()</td><td colspan="2">判斷Node是否有Right Child</td></tr><tr><td>boolean</td><td>hasParent()</td><td colspan="2">判斷Node是否有Parent</td></tr><tr><td>Node</td><td>getRightChild()</td><td colspan="2">取得node的Right Child</td></tr><tr><td>Node</td><td>getLeftChild()</td><td colspan="2">取得node的Left Child</td></tr><tr><td>Node</td><td>getParent()</td><td colspan="2">取得node的Parent</td></tr><tr><td>boolean</td><td>isLeftChild()</td><td colspan="2">判斷Node是否為Left Child,在繪製Node樹狀圖時,需要call此methid去判斷繪製方向.</td></tr><tr><td>boolean</td><td>isRightChild()</td><td colspan="2">判斷Node是否為Right Child,在繪製Node樹狀圖時,需要call此methid去判斷繪製方向.</td></tr></tbody></table>