引子
承接我的上一篇博客 传送门
查询
二叉树的遍历分为前序遍历,中序遍历后序以及层级遍历,那么自然对于节点的查询也分为前序,中序,后序以及层次。
前序查询
修改BinaryTree
//BinaryTree
public Node frontGetNodeByValue(int value) {
if(this.rootNode == null) return null;
return this.rootNode.frontGetNodeByValue(value);
}
//Node
public Node frontGetNodeByValue(int value) {
Node targetNode = null;
if(this.getValue() == value) return this;
if(this.getLeftNode() != null) targetNode = this.getLeftNode().frontGetNodeByValue(value);
if(targetNode != null) return targetNode;
if(this.getRightNode() != null) targetNode = this.getRightNode().frontGetNodeByValue(value);
return targetNode;
}
测试
@Test
void testFrontGetNode() {
BinaryTree tree = new BinaryTree();
Node rootNode = new BinaryTree.Node(1);
Node leftNode = new BinaryTree.Node(2);
Node rightNode = new BinaryTree.Node(3);
Node node4 = new BinaryTree.Node(4);
Node node5 = new BinaryTree.Node(5);
Node node6 = new BinaryTree.Node(6);
Node node7 = new BinaryTree.Node(7);
tree.addNode(rootNode);
tree.addNode(leftNode);
tree.addNode(rightNode);
tree.addNode(node4);
tree.addNode(node5);
tree.addNode(node6);
tree.addNode(node7);
System.out.println(tree.frontGetNodeByValue(7));
}
结果
中序查询
修改BinaryTree
//BinaryTree
public Node centerGetNodeByValue(int value) {
if(this.rootNode == null) return null;
return this.rootNode.centerGetNodeByValue(value);
}
//Node
public Node centerGetNodeByValue(int value){
Node targetNode = null;
if(this.getLeftNode() != null) targetNode = this.getLeftNode().centerGetNodeByValue(value);
if(targetNode != null) return targetNode;
if(this.getValue() == value) return this;
if(this.getRightNode() != null) targetNode = this.getRightNode().centerGetNodeByValue(value);
return targetNode;
}
测试
@Test
void testCenterGetNode() {
BinaryTree tree = new BinaryTree();
Node rootNode = new BinaryTree.Node(1);
Node leftNode = new BinaryTree.Node(2);
Node rightNode = new BinaryTree.Node(3);
Node node4 = new BinaryTree.Node(4);
Node node5 = new BinaryTree.Node(5);
Node node6 = new BinaryTree.Node(6);
Node node7 = new BinaryTree.Node(7);
tree.addNode(rootNode);
tree.addNode(leftNode);
tree.addNode(rightNode);
tree.addNode(node4);
tree.addNode(node5);
tree.addNode(node6);
tree.addNode(node7);
System.out.println(tree.centerGetNodeByValue(7));
}
结果
后序查询
修改BinaryTree
//BinaryTree
public Node lastGetNodeByValue(int value) {
if(this.rootNode == null) return null;
return this.rootNode.lastGetNodeByValue(value);
}
//Node
public Node lastGetNodeByValue(int value) {
Node targetNode = null;
if(this.getLeftNode() != null) targetNode = this.getLeftNode().lastGetNodeByValue(value);
if(targetNode != null) return targetNode;
if(this.getRightNode() != null) targetNode = this.getRightNode().lastGetNodeByValue(value);
if(targetNode != null) return targetNode;
if(this.getValue() == value) return this;
return targetNode;
}
测试
@Test
void testLastGetNode() {
BinaryTree tree = new BinaryTree();
Node rootNode = new BinaryTree.Node(1);
Node leftNode = new BinaryTree.Node(2);
Node rightNode = new BinaryTree.Node(3);
Node node4 = new BinaryTree.Node(4);
Node node5 = new BinaryTree.Node(5);
Node node6 = new BinaryTree.Node(6);
Node node7 = new BinaryTree.Node(7);
tree.addNode(rootNode);
tree.addNode(leftNode);
tree.addNode(rightNode);
tree.addNode(node4);
tree.addNode(node5);
tree.addNode(node6);
tree.addNode(node7);
System.out.println(tree.lastGetNodeByValue(7));
}
结果
层次查询
修改BinaryTree
//BinaryTree
public Node GetNodeByValue(int value) {
if(this.rootNode == null) return null;
return GetNode(value);
}
private Node GetNode(int value) {
LinkedList<Node> list = new LinkedList<>();
list.offer(rootNode);
Node currNode = null;
while(!list.isEmpty())
{
Node node = list.poll();
if(node.getValue() == value)
{
currNode = node;
break;
}
if(node.getLeftNode() != null) list.offer(node.getLeftNode());
if(node.getRightNode() != null) list.offer(node.getRightNode());
}
return currNode;
}
测试
@Test
void testGetNode() {
BinaryTree tree = new BinaryTree();
Node rootNode = new BinaryTree.Node(1);
Node leftNode = new BinaryTree.Node(2);
Node rightNode = new BinaryTree.Node(3);
Node node4 = new BinaryTree.Node(4);
Node node5 = new BinaryTree.Node(5);
Node node6 = new BinaryTree.Node(6);
Node node7 = new BinaryTree.Node(7);
tree.addNode(rootNode);
tree.addNode(leftNode);
tree.addNode(rightNode);
tree.addNode(node4);
tree.addNode(node5);
tree.addNode(node6);
tree.addNode(node7);
System.out.println(tree.GetNodeByValue(7));
}
结果