java-二叉树中节点查找与删除子树
二叉树中节点的查找
实现的步骤:递归实现先查找当前节点,在查找当前节点的子节点,在查找当前节点的右节点。
/**
* 二叉树中节点的查找
* @param rootNode
* @param str
*/
public static Node searchNode(Node rootNode,String str) {
Node currentNode = null;
if(rootNode.value.equals(str)) {
return rootNode;
}else {
if (rootNode.leftNode!=null) {
currentNode = searchNode(rootNode.leftNode, str);
}
if(currentNode!=null) {
return currentNode;
}
if(rootNode.rightNode!=null) {
currentNode = searchNode(rootNode.rightNode, str);
}
}
return currentNode;
}
public static void main(String[] args) {
// 创建二叉树
Node nodeA = new Node("A");
Node nodeB = new Node("B");
Node nodeC = new Node("C");
Node nodeD = new Node("D");
Node nodeE = new Node("E");
Node nodeF = new Node("F");
Node nodeG = new Node("G");
nodeA.leftNode = nodeB;
nodeA.rightNode = nodeC;
nodeB.leftNode = nodeD;
nodeB.rightNode = nodeE;
nodeC.leftNode = nodeF;
nodeC.rightNode = nodeG;
// 二叉树节点的查找
Node node = searchNode(nodeA, "G");
System.out.println(node);
}
二叉树中子树的删除
递归判断当前节点是不是要删除的节点,在判断当前节点的左节点是不是要删除的节点,在判断当前节点的右节点是不是要删除的节点。
/**
* 非递归方式前序遍历
* @param rootNode
*/
public static void preOrderNon(Node rootNode) {
if (rootNode == null) return;
Stack<Node> stack = new Stack<Node>();
stack.push(rootNode);
while(!stack.isEmpty()) {
Node node = stack.pop();
System.out.print(node.value);
if (node.rightNode!=null) stack.push(node.rightNode);
if (node.leftNode!=null) stack.push(node.leftNode);
}
}
/**
* 二叉树中节点的删除
* @param rooNode
* @param str
*/
public static void delNode(Node rootNode,String str) {
if(rootNode.value.equals(str)) {
rootNode.leftNode = null;
rootNode.rightNode = null;
rootNode.value = "";
}else {
if (rootNode.leftNode!=null) {
delNode(rootNode.leftNode, str);
}
if(rootNode.rightNode!=null) {
delNode(rootNode.rightNode, str);
}
}
public static void main(String[] args) {
// 创建二叉树
Node nodeA = new Node("A");
Node nodeB = new Node("B");
Node nodeC = new Node("C");
Node nodeD = new Node("D");
Node nodeE = new Node("E");
Node nodeF = new Node("F");
Node nodeG = new Node("G");
nodeA.leftNode = nodeB;
nodeA.rightNode = nodeC;
nodeB.leftNode = nodeD;
nodeB.rightNode = nodeE;
nodeC.leftNode = nodeF;
nodeC.rightNode = nodeG;
// 二叉树节点的删除
delNode(nodeA, "F");
// 前序遍历二叉树:
preOrderNon(nodeA);
}
