IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 二叉树的知识之2利用前中后遍历来查找特定的值 -> 正文阅读

[数据结构与算法]二叉树的知识之2利用前中后遍历来查找特定的值

思路和代码实现

寻找节点3示意图

利用前序遍历查找思路

  1. 先确定当前节点是否是要查找的target
  2. 如果是,则返回当前节点
  3. 如果不是,则判断当前节点的左子节点是否为空,如果不为空则递归前序遍历查找
  4. 如果左递归前序查找找到目标节点则返回,如果左递归没有找到,则判断右子节点是否为空,如果不为空,则继续向右遍历查找,最后返回结果。
//前序查找;根节点-左子树-右子树
    public NodeNN preOrderSearch(int no){
        System.out.println("前序遍历的次数");
        //先遍历根节点
        if(this.no==no){
            return this;
        }
        NodeNN result=null;
        //如果左遍历不为空,则需要进行递归遍历
        if (this.left!=null){
            result=this.left.preOrderSearch(no);
        }
        //如何结果不为零说明左节点找着了,直接返回即可
        if(result!=null){
            return result;
        }
        //走到此处,说明左边查找的结果为null,即要开始右边进行查找
        if(this.right!=null){
            result=this.right.preOrderSearch(no);
        }
        //不管找没找到都要返回,此时result可能为null
        return result;
    }

利用中序遍历查找思路

  1. 先判断左子节点是否为空,如果不为空则递归中序查找,
  2. 如果找到则返回,如果没有找到则和按当前节点比较,如果是目标,则返回当前的节点,如果不是,则继续进行右递归的中序查找
  3. 如果右递归中序查找找到了则返回,否则返回null
//中序查找:左-根节点-右
    //中序查找
    public NodeNN inOrderSearch(int no){

        NodeNN result=null;
        //先找递归查找左边节点,
        if(this.left!=null){
            result=this.left.inOrderSearch(no);
        }
        //如果左子树遍历结束以后,结果不为空,说明找到了,直接返回即可
        if(result!=null){
            return result;
        }
        System.out.println("中序遍历的次数");
        //左子树查找之后如果仍然为空,则找根节点
        if(this.no==no){
            return this;
        }
        //走到此处,说明根节点不是目标节点,则开始递归找右子树
        if(this.right!=null){
            result=this.right.inOrderSearch(no);
        }
        return result;
    }

利用后序遍历查找思路

  1. 先判断左子节是否为空,如果不为空则左边进行递归后序遍历查找
  2. 左边没有,则判断右边节点是否为空,如果不为空,则对右边进行遍历查找
  3. 右边如果没有找到则判断当前节点是否是目标节点
//后序查找
    public NodeNN postOrderSearch(int no){
        NodeNN result=null;
        //先判断左子树是否为空
        if(this.left!=null){
            result=this.left.postOrderSearch(no);
        }
        //返回左子树查找之后二点值,如果左子树查到了,即不为空,可以直接退出递归将结果返回
        if(result!=null){
            return result;
        }
        //走到此处说明左子树没有找到,判断右子树是否为空,如果不为空则递归查找
        if(this.right!=null){
            result=this.right.postOrderSearch(no);
        }
        //若找到结果,将结果直接返回
        if(result!=null){
            return result;
        }
        System.out.println("后序遍历的次数");
        //最后判断根节点是否为目标节点
        if(this.no==no){
            return this;
        }
        return result;
    }

测试代码

package com.njupt.binaryTree;

/**
 * Creat with IntelliJ IDEA
 *
 * @Auther:倔强的加瓦
 * @Date:2021/07/22/20:18
 * @Description:
 */
public class Search {
    public static void main(String[] args) {
        Binary binary = new Binary();
        NodeNN node1=new NodeNN(1,"吴吴");
        NodeNN node2=new NodeNN(2,"亦亦");
        NodeNN node3=new NodeNN(3,"凡凡");
        NodeNN node4=new NodeNN(4,"签签");
        NodeNN node5=new NodeNN(5,"word");
        NodeNN node6=new NodeNN(6,"very big");
        node1.left=node2;
        node1.right=node4;
        node2.left=node3;
        node4.left=node5;
        node4.right=node6;
        //给根节点赋值
        binary.root=node1;

        System.out.println("前序遍历:");
        System.out.println(binary.pre(3));
        System.out.println("中序遍历:");
        System.out.println(binary.in(3));
        System.out.println("后序遍历:");
        System.out.println(binary.post(3));


    }

}
//创建二叉树,来管理每一个节点
class Binary{
    public NodeNN root;
    //前序遍历查找
    public NodeNN pre(int no){
        if(root!=null){
            return root.preOrderSearch(no);
        }else{
            return null;
        }
    }
    //中序遍历查找
    public NodeNN in(int no){
        if(root!=null){
            return root.inOrderSearch(no);
        }else{
            return null;
        }
    }
    //后序遍历查找
    public NodeNN post(int no){
        if(root!=null){
            return root.postOrderSearch(no);
        }else{
            return null;
        }
    }
}
class NodeNN{
    public int no;
    public String name;
    public NodeNN left;
    public NodeNN right;

    public NodeNN(int no, String name) {
        this.no = no;
        this.name = name;
    }

    @Override
    public String toString() {
        return "Node1{" +
                "no=" + no +
                ", name='" + name + '\'' +
                '}';
    }

    //前序查找
    public NodeNN preOrderSearch(int no){
        System.out.println("前序遍历的次数");
        if(this.no==no){
            return this;
        }
        NodeNN result=null;
        //如果左遍历不为空,则需要进行递归遍历
        if (this.left!=null){
            result=this.left.preOrderSearch(no);
        }
        //如何结果不为零说明左节点找着了,直接返回即可
        if(result!=null){
            return result;
        }
        //走到此处,说明左边查找的结果为null,即要开始右边进行查找
        if(this.right!=null){
            result=this.right.preOrderSearch(no);
        }
        return result;
    }
    //中序查找
    public NodeNN inOrderSearch(int no){

        NodeNN result=null;
        //先找左边节点
        if(this.left!=null){
            result=this.left.inOrderSearch(no);
        }
        if(result!=null){
            return result;
        }
        System.out.println("中序遍历的次数");
        if(this.no==no){
            return this;
        }
        if(this.right!=null){
            result=this.right.inOrderSearch(no);
        }
        return result;
    }
    //后序查找
    public NodeNN postOrderSearch(int no){
        NodeNN result=null;
        if(this.left!=null){
            result=this.left.postOrderSearch(no);
        }
        if(result!=null){
            return result;
        }
        if(this.right!=null){
            result=this.right.postOrderSearch(no);
        }
        if(result!=null){
            return result;
        }
        System.out.println("后序遍历的次数");
        if(this.no==no){
            return this;
        }
        return result;
    }

}


结果:

前序遍历:
前序遍历的次数
前序遍历的次数
前序遍历的次数
Node1{no=3, name='凡凡'}
中序遍历:
中序遍历的次数
Node1{no=3, name='凡凡'}
后序遍历:
后序遍历的次数
Node1{no=3, name='凡凡'}

Process finished with exit code 0
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-07-23 11:03:36  更:2021-07-23 11:06:45 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/5 6:26:25-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码