【数据结构】——创建二叉树,以及用四种遍历方式,查找二叉树中指定的结点

总体简述,需要创建三个类

  • 结点类(存放结点的属性)
  • 二叉树框架(一颗空的二叉树,里面包含一些二叉树的方法)
  • 主方法(创建二叉树,为二叉树赋予结点)

首先创建一个结点类

  • no:结点的编号,也就是在树中的序号
  • value:结点的值
  • leftNode:当前结点的左结点
  • rightNode:当前结点的右节点

然后将这些属性封装起来,并重写toString方法,用于打印结点的信息

这些都属于结点的属性,所以都写在结点类中

package tree.binaryTreeSearcch;

/**
 * 创建一个结点
 */
class TreeNode {
    // 结点编号
    private int no;
    // 结点的值
    private int value;
    // 左结点
    private TreeNode leftNode;
    // 右节点
    private TreeNode rightNode;

    TreeNode(int no, int value) {
        this.no = no;
        this.value = value;
    }

    // 设置左结点
    public void setLeftNode(TreeNode leftNode) {
        this.leftNode = leftNode;
    }
    // 设置右节点
    public void setRightNode(TreeNode rightNode) {
        this.rightNode = rightNode;
    }

    public void setNo(int no) {
        this.no = no;
    }

    public void setValue(int value) {
        this.value = value;
    }

    public int getNo() {
        return no;
    }

    public int getValue() {
        return value;
    }

    public TreeNode getLeftNode() {
        return leftNode;
    }

    public TreeNode getRightNode() {
        return rightNode;
    }

    @Override
    public String toString() {
        return "no : " + this.no + ", value : " + this.value;
    }
}

然后创建一个二叉树框架

其实在创建这个二叉树的时候,只设置一个根结点,而其它结点都是在根结点上依次往下相连的

在查找中,设置了一个target,用于接收找到的结点

  • 如果找到目标结点,则返回这个结点
  • 那么上一层target接收的就是找到的结点
  • 然后在下面判断target是否为空时,向上一层返回的还是找到的那个结点
  • 这样最终返回的依然是找到的结点
package tree.binaryTreeSearcch;

import java.util.LinkedList;
import java.util.Queue;

/**
 * 创建一个空的二叉树框架
 */
public class BinaryTree {

    private TreeNode root;

    // 设置根结点
    public void setNode(TreeNode root) {
        this.root = root;
    }
    // 获取根结点
    public TreeNode getNode() {
        return root;
    }
    /**
     * 实现二叉树的一些查找方法
     */
    // 先序查找指定结点
    public TreeNode preorderSearch(int no, TreeNode curNode) {
        TreeNode target = null;
        if (curNode == null) {
            return null;
        }
        // 如果找到目标结点,则返回这个结点
        // 那么上一层接收到的target也是这个结点
        // 然后在下面判断target是否为空时,向上一层返回的还是找到的那个结点
        // 这样最终返回的就是找到的结点
        if (curNode.getNo() == no) {
            return curNode;
        }
        target = preorderSearch(no, curNode.getLeftNode());
        if (target != null) { // 说明找到了
            return target;
        }
        target = preorderSearch(no, curNode.getRightNode());
        if (target != null) { // 说明找到了
            return target;
        }
        return target;
    }
    // 中序查找指定结点
    public TreeNode inorderSearch(int no, TreeNode curNode) {
        TreeNode target = null;
        if (curNode == null) {
            return null;
        }
        target = inorderSearch(no, curNode.getLeftNode());
        if (target != null) {
            return target;
        }
        if (curNode.getNo() == no) {
            return curNode;
        }
        target = inorderSearch(no, curNode.getRightNode());
        if (target != null) {
            return target;
        }
        return target;
    }
    // 后序查找指定结点
    public TreeNode postorderSearch(int no, TreeNode curNode) {
        TreeNode target = null;
        if (curNode == null) {
            return null;
        }
        target = postorderSearch(no, curNode.getLeftNode());
        if (target != null) {
            return target;
        }
        target = postorderSearch(no, curNode.getRightNode());
        if (target != null) {
            return target;
        }
        if (curNode.getNo() == no) {
            target = curNode;
            return curNode;
        }
        return target;
    }
    // 层次查找指定结点
    public TreeNode levelSearch(int no, TreeNode curNode) {
        TreeNode target = null;
        if (curNode == null) {
            return null;
        }
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(curNode);
        while (!queue.isEmpty()) {
            TreeNode treeNode = queue.poll();
            if (treeNode.getNo() == no) {
                return treeNode;
            }
            if (treeNode.getLeftNode() != null) {
                queue.offer(treeNode.getLeftNode());
            }
            if (treeNode.getRightNode() != null) {
                queue.offer(treeNode.getRightNode());
            }
        }
        return target;
    }
}

最后创建主方法,为二叉树赋予结点

查找返回的是一个结点,所以还需判断这个结点是否为空

  • 如果为空,则说明没有找到
  • 如果不为空,则说明找到了,然后打印出结点的信息
package tree.binaryTreeSearcch;

public class MainTest {
    public static void main(String[] args) {
        // 创建一个空的二叉树框架
        BinaryTree binaryTree = new BinaryTree();
        // 创建一个根结点
        TreeNode root = new TreeNode(0, 0);
        // 将根结点设置为二叉树的根
        binaryTree.setNode(root);
        // 创建其它结点
        TreeNode leftNode1 = new TreeNode(1, 11);
        TreeNode rightNode1 = new TreeNode(2, 22);
        TreeNode leftNode2 = new TreeNode(3, 33);
        TreeNode rightNode2 = new TreeNode(4, 44);
        // 将结点连接起来
        root.setLeftNode(leftNode1);
        root.setRightNode(rightNode1);
        leftNode1.setLeftNode(leftNode2);
        leftNode1.setRightNode(rightNode2);
        // 此时二叉树已经创建完成
        // 按序号查找指定结点
        // 先序查找
        TreeNode preResult = binaryTree.preorderSearch(1, root);
        if (preResult != null) {
            System.out.println("前序查找--> " + preResult.toString());
        } else {
            System.out.println("前序查找:没有找到此结点");
        }
        // 中序查找
        TreeNode inResult = binaryTree.inorderSearch(2, root);
        if (inResult != null) {
            System.out.println("中序查找--> " + inResult.toString());
        } else {
            System.out.println("中序查找:没有找到此结点");
        }
        // 后序查找
        TreeNode postResult = binaryTree.postorderSearch(3, root);
        if (postResult != null) {
            System.out.println("后序查找--> " + postResult.toString());
        } else {
            System.out.println("后序查找:没有找到此结点");
        }
        // 层次查找
        TreeNode levelResult = binaryTree.levelSearch(4, root);
        if (levelResult != null) {
            System.out.println("层次查找--> " + levelResult.toString());
        } else {
            System.out.println("层次查找:没有找到此结点");
        }
    }
}

查询结果如下

 下图就是上面代码创建的二叉树

因为我们在创建结点的时候,为其加上了一条编号的属性,所以可以按照编号来查找

那么还可以按照结点的值来查找,或者直接按照某个结点来查找都是一样的

只需将以上查找方法中的参数(int no)改为(int value)或者(TreeNode targetNode),然后在方法内部修改判断条件即可

扫描二维码关注公众号,回复: 10684691 查看本文章
发布了34 篇原创文章 · 获赞 20 · 访问量 6974

猜你喜欢

转载自blog.csdn.net/weixin_42193813/article/details/105436513