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); }