package acm.result.test1;
/**
* @author BTiger
*
*/
public class Main {
/**
* 二叉樹遍歷,三種方法
*
* @param args
*/
public static void main(String[] args) {
Tree tree = getTree();
Node root = tree.getRoot();
// 先根遍歷
System.out.println("先根遍歷");
tree.rootFirst(root);
System.out.println();
// 中根遍歷
System.out.println("中根遍歷");
tree.middleFirst(root);
System.out.println();
// 後根遍歷
System.out.println("後根遍歷");
tree.rootLast(root);
System.out.println();
// 求二叉樹節點個數
System.out.println("二叉樹的節點個數是:" + tree.getNodeCount());
// 求二叉樹高度
System.out.println("二叉樹高度是:" + tree.height());
// 查找給定數值
System.out.println("C的對應的節點是:" + tree.search("C").data);
// 查找給定數值對應節點的父節點
Node s = tree.search("H");
Node parent = tree.getParent(s);
if (parent != null)
System.out.println("H的父母節點是:" + parent.data);
// 查找所有祖先節點
System.out.print("H的祖先節點分別是:");
while (parent != null) {
System.out.print(parent.data + " ");
parent = tree.getParent(parent);
}
}
/**
* 構造二叉樹
*
* @return
*/
private static Tree getTree() {
Node root = new Node();
Node b = new Node();
Node c = new Node();
Node d = new Node();
Node e = new Node();
Node f = new Node();
Node g = new Node();
Node h = new Node();
root.setData("A");
b.setData("B");
c.setData("C");
d.setData("D");
e.setData("E");
f.setData("F");
g.setData("G");
h.setData("H");
root.setLeftNode(b);
root.setRightNode(c);
b.setLeftNode(d);
d.setRightNode(g);
c.setLeftNode(e);
c.setRightNode(f);
f.setLeftNode(h);
Tree tree = new Tree();
tree.setRoot(root);
return tree;
}
}
class Tree {
public Node root = null;
public Node getRoot() {
return root;
}
public void setRoot(Node root) {
this.root = root;
}
public boolean isEmpty() {
return this.root == null;
}
/**
* 先根遍歷
*
* @param root
*/
public void rootFirst(Node root) {
System.out.print(root.getData() + " ");// 打印根節點
if (root.getLeftNode() != null) {// 打印左節點
rootFirst(root.getLeftNode());
}
if (root.getRightNode() != null) {// 打印右節點
rootFirst(root.getRightNode());
}
}
/**
* 中根遍歷
*
* @param root
*/
public void middleFirst(Node root) {
if (root.getLeftNode() != null) {// 打印左節點
middleFirst(root.getLeftNode());
}
System.out.print(root.getData() + " ");// 打印根節點
if (root.getRightNode() != null) {// 打印右節點
middleFirst(root.getRightNode());
}
}
/**
* 後根遍歷
*
* @param root
*/
public void rootLast(Node root) {
if (root.getLeftNode() != null) {// 打印左節點
rootLast(root.getLeftNode());
}
if (root.getRightNode() != null) {// 打印右節點
rootLast(root.getRightNode());
}
System.out.print(root.getData() + " ");// 打印根節點
}
/**
* 獲取節點個數
*
* @return
*/
public int getNodeCount() {
return getNodeCount(root);
}
public int getNodeCount(Node root) {
if (root != null)
return 1 + getNodeCount(root.leftNode)
+ getNodeCount(root.rightNode);
else
return 0;
}
/**
* 求高度 從根節點的左節點找即可
*
* @param
*/
public int height() {
return height(root);
}
public int height(Node root) {
if (root != null) {
int ld = height(root.leftNode);
int rd = height(root.rightNode);
return ld > rd ? ld + 1 : rd + 1;
}
return 0;
}
/**
* 查找給定數據對應的節點
*/
public Node search(String value) {
return search(root, value);
}
public Node search(Node root, String value) {
if (root != null) {
if (value.equals(root.getData())) {
return root;
} else {
Node ls = search(root.leftNode, value);
return (ls != null) ? ls : search(root.rightNode, value);
}
}
return null;
}
/**
* 查找給定數據對應的節點的父母節點
*/
public Node getParent(Node node) {
return getParent(root, node);
}
public Node getParent(Node root, Node node) {
Node find = null;
if (root != null) {
if (root.leftNode == node || root.rightNode == node) {
find = root;
} else {
find = getParent(root.leftNode, node);
return (find != null) ? find : getParent(root.rightNode, node);
}
}
return find;
}
}
class Node {
public String data;
public Node leftNode = null, rightNode = null;
public boolean isLeaf() {
return this.leftNode == null && this.rightNode == null;
}
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
public Node getLeftNode() {
return leftNode;
}
public void setLeftNode(Node leftNode) {
this.leftNode = leftNode;
}
public Node getRightNode() {
return rightNode;
}
public void setRightNode(Node rightNode) {
this.rightNode = rightNode;
}
}