代码来自闵老师”日撸 Java 三百行(21-30天)“,链接:https://blog.csdn.net/minfanphd/article/details/116975721
package datastructure.tree;
public class BinaryCharTree {
/**
* The value in char
*/
char value;
/**
* The left child.
*/
BinaryCharTree leftChild;
/**
* The right child.
*/
BinaryCharTree rightChild;
/**
* The first constructor.
*
* @param paraName The value.
*/
public BinaryCharTree(char paraName) {
// TODO Auto-generated constructor stub
value = paraName;
leftChild = null;
rightChild = null;
}//of the first BinaryCharTree
/**
* Manually construct a tree. Only for testing.
*/
public static BinaryCharTree manualConstructTree() {
//Step 1. Construct a tree with only one node.
BinaryCharTree resultTree = new BinaryCharTree('a');
//Step 2. Construct all nodes, the first node is the root.
BinaryCharTree tempTreeB = new BinaryCharTree('b');
BinaryCharTree tempTreeC = new BinaryCharTree('c');
BinaryCharTree tempTreeD = new BinaryCharTree('d');
BinaryCharTree tempTreeE = new BinaryCharTree('e');
BinaryCharTree tempTreeF = new BinaryCharTree('f');
BinaryCharTree tempTreeG = new BinaryCharTree('g');
//Step 3. Link all nodes.
resultTree.leftChild = tempTreeB;
resultTree.rightChild = tempTreeC;
tempTreeB.rightChild = tempTreeD;
tempTreeC.leftChild = tempTreeE;
tempTreeD.leftChild = tempTreeF;
tempTreeD.rightChild = tempTreeG;
return resultTree;
}//of manualConstructTree
/**
* ************************************************
* Pre-order visit.
* ************************************************
*/
public void preOrderVisit() {
System.out.print(" " + value + " ");
if (leftChild != null) {
leftChild.preOrderVisit();
}//of if
if (rightChild != null) {
rightChild.preOrderVisit();
}//of if
}//of preOrderVisit
/**
* ***************************************************
* In-order visit.
* ***************************************************
*/
public void inOrderVisit() {
if (leftChild != null) {
leftChild.inOrderVisit();
}//of if
System.out.print(" " + value + " ");
if (rightChild != null) {
rightChild.inOrderVisit();
}//of if
}//of inOrderVisit
/**
* ***************************************************
* Post-order visit.
* ***************************************************
*/
public void postOrderVisit() {
if (leftChild != null) {
leftChild.postOrderVisit();
}//of if
if (rightChild != null) {
rightChild.postOrderVisit();
}//of if
System.out.print(" " + value + " ");
}//of postOrderVisit
/**
* ************************************************
* Get the depth of the binary tree.
*
* @return The depth.
* ************************************************
*/
public int getDepth() {
//It is a leaf.
if ((leftChild == null) && (rightChild == null)) {
return 1;
}//of if
//The depth of the left child.
int tempLeftDepth = 0;
if (leftChild != null) {
tempLeftDepth = leftChild.getDepth();
}//of if
//The depth of the right child.
int tempRightDepth = 0;
if (rightChild != null) {
tempRightDepth =rightChild.getDepth();
}//of if
//The depth should increment by 1.
if (tempLeftDepth >= tempRightDepth) {
return tempLeftDepth + 1;
} else {
return tempRightDepth + 1;
}
}//of getDepth
/**
*
* @return The number
*/
public int getNumNodes() {
//It is a leaf.
if ((leftChild == null) && (rightChild == null)) {
return 1;
}//of if
//The number of left nodes.
int tempLeftNum = 0;
if (leftChild != null) {
tempLeftNum = leftChild.getNumNodes();
}//of if
//The number of right nodes.
int tempRightNum = 0;
if (rightChild != null) {
tempRightNum =rightChild.getNumNodes();
}//of if
//The total number of the binary tree.
int tempResultNum = tempLeftNum + tempRightNum + 1;
return tempResultNum;
}//of getNumNodes
/**
* *********************************************************
* The entrance of the program.
*
* @param args Not used now
* *********************************************************
*/
public static void main(String args[]) {
BinaryCharTree tempTree = manualConstructTree();
System.out.println("\r\nPre-order visit:");
tempTree.preOrderVisit();
System.out.println("\r\nIn-order visit:");
tempTree.inOrderVisit();
System.out.println("\r\nPost-order visit:");
tempTree.postOrderVisit();
int tempDepth = tempTree.getDepth();
System.out.println("\rThe depth is: " + tempDepth);
System.out.println("\nThe number of nodes for the binary tree is: " + tempTree.getNumNodes());
}//of main
}//of BinaryCharTree
1、树的前序、中序、后续遍历是针对根节点而言的。根节点在最前面,则是前序遍历。根节点在左子树之后,在右子树之前,则是中序遍历。根节点在左右子树后面,则是后续遍历。
2、在写getDepth()时,想到自增1为啥不能在左右分支的if语句里进行?后面自己进行了测试,结果也是正确的。后面又在getNumNodes()里面进行了测试,发现结果是错误的。树的节点数是7个,如果在if语句里进行自加,最终运行出来的结果是9。后来想了一下想明白了,在getNumNodes()中如果在左右分支的if语句里进行自增,当遇到左右孩子都有的节点时,递归的时候就会多自增1;在getDepth()中也是同样的道理,左右会都自增1,但是因为后面有一个比较大小,所以都自增1对结果没有影响。