目录
二叉树的遍历
1. 前中后序遍历
二叉树的前序遍历(根节点最先遍历):
中序遍历
二叉树的后续遍历:
小结:
2.二叉树的前中后续查找:
2.1二叉树的前序查找:
2.2二叉树的中序查找:
2.2二叉树的后续查找:
3 二叉树节点删除操作:
完成删除结点的操作
思路
步骤:
二叉树的遍历
1. 前中后序遍历
public class BinaryTree{
public static class BTNode{
BTNode left;
BTNode right;
int value;
BTNode(int value){
this.value = value;
}
}
private BTNode root;public void createBinaryTree(){
BTNode node1 = new BTNode(1);
BTNode node2 = new BTNode(2);
BTNode node3 = new BTNode(3);
BTNode node4 = new BTNode(4);
BTNode node5 = new BTNode(5);
BTNode node6 = new BTNode(6);
root = node1;
node1.left = node2;
node2.left = node3;
node1.right = node4;
node4.left = node5;
node4.right = node6;
}
}
二叉树的前中后序遍历:
通过上面的简单介绍,我们可以开始正式学习接下来的操作了
二叉树的前序遍历(根节点最先遍历):
基本思路:
若二叉树为空,什么都不做,否则:
i、先访问根结点;
ii、再前序遍历左子树;
iii、最后前序遍历右子树;
动画展示
代码实现:
//前序遍历public static void preOrder(KunBinaryTree root){if(root == null){return ;}System.out.print(root.no+" "+root.name+" ");//先访问根preOrder(root.left);//接着左右子树preOrder(root.right);}
首先,我们从根节点出发,也就是,按照先根节点后左右子树的过程进行依次遍历,这里相当于先打印根节点所对应的数据域中的信息后,在接着递归调用左子树,直到为空,回溯后递归调用右子树,直到为空。该树的左子树(总的)调用完后, 开始调用右子树,来到②过程,按照(根-----》左子树---》右子树)的规则继续递归。直到左右子树都为空,返回,也就是③,④过程。
输出结果为:123456
中序遍历
基本思路:
若二叉树为空,什么也不做,否则:
i、后序遍历左子树
ii、访问根结点
iii、后序遍历右子树
代码实现:
//后续遍历public static void postOrder(KunBinaryTree root){if(root == null){return ;}postOrder(root.left);System.out.print(root.no +" "+root.name+" ");postOrder(root.right);}
二叉树的后续遍历:
基本思路:
若二叉树为空,什么也不做,否则:
i、后序遍历左子树
ii、后序遍历右子树
iii、访问根结点
代码实现:
//后续遍历public static void postOrder(KunBinaryTree root){if(root == null){return ;}postOrder(root.left);postOrder(root.right);System.out.print(root.no +" "+root.name+" ");}
输出结果:
后序遍历结果:3 2 5 6 4 1
小结:
比较各个遍历的过程
前序遍历:根结点 ---> 左子树 ---> 右子树
中序遍历:左子树---> 根结点 ---> 右子树
后序遍历:左子树 ---> 右子树 ---> 根结点
前中后其实说的就是根节点遍历的顺序
2.二叉树的前中后续查找:
有了前中后续遍历的实现,我们接着就能实现查找过程,这是基于遍历来实现的
2.1二叉树的前序查找:
基本思路:
1.先判断当前节点的no(序号)是否等于要查找的
2.如果是相等的,则返回当前节点
3.如果不等,则判断当前节点的左右子节点是否为空,如果不为空,则递归前序查找
4.如果左递归前序查找找到节点,则返回,否则继续判断当前节点的左右子节点是否为空,如果不为空,则继续右递归前序查找
代码实现:
// 前序查找public BTNode preOrderSearch(BTNode node, int value) {if (node == null) {return null; // 如果节点为空,返回 null}// 如果找到节点,返回该节点if (node.value == value) {return node;}// 在左子树中查找BTNode foundNode = preOrderSearch(node.left, value);if (foundNode != null) {return foundNode; // 如果在左子树找到,直接返回}// 在右子树中查找return preOrderSearch(node.right, value);}
2.2二叉树的中序查找:
基本思路:
1.判断当前节点的左右子节点是否为空,如果不为空,则递归中序查找
2.如果找到,则返回,若果没有找到,就和当前节点比较,如果是则返回当前节点,否则继续进行右递归的中序查找
3.右递归中序查找,找到就返回,否则返回null
// 中序查找public BTNode preOrderSearch(BTNode node, int value) {if (node == null) {return null; // 如果节点为空,返回 null}// 在左子树中查找BTNode foundNode = preOrderSearch(node.left, value);if (foundNode != null) {return foundNode; // 如果在左子树找到,直接返回}// 如果找到节点,返回该节点if (node.value == value) {return node;}// 在右子树中查找return preOrderSearch(node.right, value);}
2.2二叉树的后续查找:
基本思路:
1.判断当前节点的左子节点是否为空,如果不为空,则递归后序查找
2.如果找到,就返回,如果没有找到,就判断当前节点的有子节点是否为空,如果不为空,则右递归进行后序查找,如果找到,就返回
3.接着和当前节点进行比较,找到则返回,否则返回null
代码实现:
// 前序查找public BTNode preOrderSearch(BTNode node, int value) {if (node == null) {return null; // 如果节点为空,返回 null}// 在左子树中查找BTNode foundNode = preOrderSearch(node.left, value);if (foundNode != null) {return foundNode; // 如果在左子树找到,直接返回}// 在右子树中查找return preOrderSearch(node.right, value);}// 如果找到节点,返回该节点if (node.value == value) {return node;}}
3 二叉树节点删除操作:
完成删除结点的操作
规定:
1)如果删除的节点是叶子节点,则删除该节点
2)如果删除的节点是非叶子节点,则删除该子树
思路
首先先处理:
考虑如果树是空树root,如果只有一个root结点,则等价将二叉树置空
步骤:
1.因为我们的二叉树是单向的,所以我们是判断当前结点的子结点是来需要删除而不能去判断当前这个结点是不是需要删除结点.
2.如果当前结点的左子结点不为空,并且左子结点就是要删除结点,就将this.left并且就返回(结束递归删除)
3.如果当前结点的右子结点不为空,并且右子结点就是要删除结点,就将this.righ null;并且就返回(结束递归删除)
4.如果第2和第3步没有删除结点,那么我们就需要向左子树进行递归删除
5. 如果第4步也没有删除结点,则应当向右子树进行递归删除.
//删除节点public static void delTreeNode(KunBinaryTree root,int no){if(root.no == no){root = null;}else{if(root.left != null && root.left.no == no){root.left = null;return ;}if(root.right != null && root.right.no == no){root.right = null;return ;}if(root.left != null){delTreeNode(root.left,no);}if(root.right != null){delTreeNode(root.right,no);}}}
当我们删除4这个子节点时,后面的节点也一并删除了:
最后,完整代码:
public class Main {public static void main(String[] args) {BinaryTree b = new BinaryTree();b.createBinaryTree();System.out.println("前序遍历:");b.preOrderTraversal(b.getRoot());System.out.println("\n中序遍历:");b.inOrderTraversal(b.getRoot());System.out.println("\n后序遍历:");b.postOrderTraversal(b.getRoot());BinaryTree.BTNode foundNode = b.preOrderSearch(b.getRoot(),5);if (foundNode != null) {System.out.println("\n找到节点: " + foundNode.value);} else {System.out.println("\n未找到节点值: " + 5);}System.out.println("删除前");System.out.println("前序遍历:");b.preOrderTraversal(b.getRoot());System.out.println("删除后");b.delTreeNode(b.getRoot(),4);System.out.println("前序遍历:");b.preOrderTraversal(b.getRoot());}
}
public class BinaryTree {public static class BTNode {BTNode left;BTNode right;int value;BTNode(int value) {this.value = value;}}private BTNode root;public void createBinaryTree() {BTNode node1 = new BTNode(1);BTNode node2 = new BTNode(2);BTNode node3 = new BTNode(3);BTNode node4 = new BTNode(4);BTNode node5 = new BTNode(5);BTNode node6 = new BTNode(6);root = node1;node1.left = node2;node2.left = node3;node1.right = node4;node4.left = node5;node4.right = node6;}// 前序遍历public void preOrderTraversal(BTNode node) {if (node == null) return;System.out.print(node.value + " ");preOrderTraversal(node.left);preOrderTraversal(node.right);}// 中序遍历public void inOrderTraversal(BTNode node) {if (node == null) return;inOrderTraversal(node.left);System.out.print(node.value + " ");inOrderTraversal(node.right);}// 后序遍历public void postOrderTraversal(BTNode node) {if (node == null) return;postOrderTraversal(node.left);postOrderTraversal(node.right);System.out.print(node.value + " ");}public BTNode getRoot() {return root;}// 前序查找public BTNode preOrderSearch(BTNode node, int value) {if (node == null) {return null; // 如果节点为空,返回 null}// 如果找到节点,返回该节点if (node.value == value) {return node;}// 在左子树中查找BTNode foundNode = preOrderSearch(node.left, value);if (foundNode != null) {return foundNode; // 如果在左子树找到,直接返回}// 在右子树中查找return preOrderSearch(node.right, value);}//删除节点public static void delTreeNode(BTNode root,int value){if(root.value == value){root = null;}else{if(root.left != null && root.left.value == value){root.left = null;return ;}if(root.right != null && root.right.value == value){root.right = null;return ;}if(root.left != null){delTreeNode(root.left,value);}if(root.right != null){delTreeNode(root.right,value);}}}}
到这里,竹竹零就要和大家说再见了🍕🍕🍕
如果您觉得有失偏颇请您在评论区指正,如果您觉得不错的话留个好评再走吧!!
您的鼓励就是对我最大的支持! ! !