2026/2/10 1:42:33
网站建设
项目流程
网站如何在360做提交,张家口手机台app下载,海口哪里做网站,品牌策划咨询一、构建二叉树1.引入#xff1a;如图#xff0c;树的一个节点拥有三个关键部分#xff0c;分别是左子节点#xff08;lChild#xff09;、右子节点#xff08;rChild#xff09;和值#xff08;data#xff09;。就拿有序二叉树来说#xff0c;它的特点是#xff1…一、构建二叉树1.引入如图树的一个节点拥有三个关键部分分别是左子节点lChild、右子节点rChild和值data。就拿有序二叉树来说它的特点是左子节点的值比父节点小右子节点比父节点大例如构建有序二叉树48719232.我们该如何用代码构建构建它呢①先定义一个树的Java类把它里边所含有的成员变量声明出来public class TreeNode { public TreeNode lChild; public TreeNode rChild; public Integer data; public TreeNode(Integer data){ this.data data; } }类是创建对象的模板我们先创建了类才能创建对象。②再创建一个有序二叉树的类我们把我们要写的构建方法写在里边首先创建头指针TreeNode root;然后在下边我们就改写相应的构建二叉排序树的方法了我们就要先思考它的逻辑新加入节点该如何用代码实现判断怎么根据数值大小判断是该往左子节点走还是右子节点走a.如果rootnull新插入节点为根节点如果不为null那么就进行值得判断继续往下走b.循环判断用whiletrue插入节点的值是否比当前的值小小则左走直到左边为null大则右走直到右边为null。//1.判断根节点是否为空 if(rootnull){ rootnewNode; return; } //2.不为空就循环判断值 while(true){ TreeNode curNoderoot; if(curNode.datanewNode.data){ if(curNode.rChildnull){ curNode.rChildcurNode; return; } curNodecurNode.rChild; if(curNode.datanewNode.data){ if(curNode.lChildnull){ curNode.lChildcurNode; return; } curNodecurNode.lChild;然后我们在Test类中测试该create方法就行了public static void main(String[] args) { BinaryTree bt new BinaryTree(); bt.create(5); bt.create(3); bt.create(7); bt.create(0); bt.create(4); bt.create(6); bt.create(9);二、树的遍历1.我们创建好了树那么树该怎么实现遍历呢首先我们要知道树的遍历有哪些种类通常形况下树的遍历自己一个一个走太麻烦了所以昨天新学了一个方法感觉还是比较好用的画三角法。就拿刚才的树来说吧画三角把各个节点小树划分出来之后变成了①前序遍历前序遍历是根左右就先看最上边的树对应写出【4 1 8】然后再遍历左边1的子节点1左右是2、3也就是【4 12 38】2和3下边没有子节点我们就再遍历右边8的子节点8的左右是7、9也就是【4 1 2 3 87 9】②中序遍历中序遍历是左根右依旧先看上边的树对应写出【1 4 8】然后遍历左边1的子节点对应写出【2134 8】遍历右边写出【2 1 3 4789】③后序遍历根据上述规则最后写出【2 3 1 7 9 8 4】④层序遍历从上到下、从左到右一层一层遍历【4 1 8 2 3 7 9】2.我们已经搞清楚了树的遍历逻辑那么如何用代码实现树的遍历呢①前序遍历写出相应的前序遍历beforeOrder方法先判断根节点是否为null空则返回不为空就分别输出根的值、左子节点的值和右子节点的值// 前序遍历 void beforeOrder(TreeNode root) { if (root null) { return; } System.out.println(root.data); beforeOrder(root.lChild); beforeOrder(root.rChild); }②中序遍历写出相应的中序遍历inOrder方法先判断根节点是否为null空则返回不为空就分别输出左子节点的值、根的值和右子节点的值//后序遍历 void afterOrder(TreeNode root) { if (root null) { return; } afterOrder(root.lChild); afterOrder(root.rChild); System.out.println(root.data); }③后序遍历写出相应的中序遍历afterOrder方法先判断根节点是否为null空则返回不为空就分别输出左子节点的值、右子节点的值和根节点的值//后序遍历 void afterOrder(TreeNode root) { if (root null) { return; } afterOrder(root.lChild); afterOrder(root.rChild); System.out.println(root.data); }④层序遍历a.初始化队列根节点入队b.循环出队节点访问该节点c.把该节点的左、右子节点下一层入队d.重复步骤 b和c直到队列为空。//层序遍历 void levelOrder(TreeNode root) { LinkedListTreeNode queuenew LinkedList(); queue.add(root); while(!queue.isEmpty()){ rootqueue.pop(); System.out.println(root.data); if(root.lChild!null){ queue.add(root.lChild); } if(root.rChild!null){ queue.add(root.rChild); } } }三、树的查询1.查询树的逻辑是什么①利用二叉搜索树 “左小右大” 的特性通过递归缩小查找范围②递归终止条件找到目标节点返回节点或遍历到空节点返回 null③分岔逻辑目标值大于当前节点则查右子树小于则查左子树实现 “二分式” 高效查找。//节点查询 public TreeNode searchNode(TreeNode root,Integer target){ if(rootnull||root.datatarget){ return root; } if(targetroot.data){ return searchNode(root.rChild,target); }else{ return searchNode(root.lChild,target); } }Test代码运行结果