首页 > 其他分享 >二叉树

二叉树

时间:2023-01-30 16:45:24浏览次数:40  
标签:Node node private 二叉树 root 节点

线索二叉树

1、问题的提出

2、线索二叉树的概念

  1. n个节点的二叉链表中包含有n+1个空指针域【2n -(n-1) = n+1】{如上图,n为6,空指针域为 7},利用二叉链表中的空指针域,存放指向该节点在(前中后序遍历)下的前驱和后继节点的指针。
  2. 这种加上线索的二叉链表称为线索链表,相应的二叉树称为线索二叉树。线索二叉树可分为前序线索二叉树,中序线索二叉树和后序线索二叉树
  3. 一个节点的前一个节点,称为前驱节点,后一个节点称为后继节点

3、线索二叉树的分析

4、线索二叉树代码分析

public class ThreadedBinaryTreeDemo {
    public static void main(String[] args) {
        Node root = new Node(1, "node1");
        Node node2 = new Node(3, "node1");
        Node node3 = new Node(6, "node1");
        Node node4 = new Node(8, "node1");
        Node node5 = new Node(10, "node1");
        Node node6 = new Node(14, "node1");
        root.setLeft(node2);
        root.setRight(node3);
        node2.setLeft(node4);
        node2.setRight(node5);
        node3.setLeft(node6);
        ThreadedBinaryTree threadedBinaryTree = new ThreadedBinaryTree(root);

        threadedBinaryTree.threadedNodes();
        // 拿着编号no为10的来测试,看一下10的左指针是不是3,右指针为1
        Node left = node5.getLeft();
        Node right = node5.getRight();
        System.out.println("left = " + left);
        System.out.println("right = " + right);

    }
}

class ThreadedBinaryTree {
    private Node root;
    // 保留当前节点的前驱节点

    private Node pre = null;
    public ThreadedBinaryTree(Node root) {
        this.root = root;
    }

    public void threadedNodes(){
        this.threadedNodes(root);
    }
    public void threadedNodes(Node node) {
        if (node == null) {
            return;
        }
        // 先线索化左边
        threadedNodes(node.getLeft());
        // 处理前驱节点
        if (node.getLeft() == null) {
            node.setLeft(pre);
            node.setLeftType(1);
        }
        // 处理后继节点
        if (pre != null && pre.getRight() == null) {
            pre.setRight(node);
            pre.setRightType(1);
        }
        pre = node;
        threadedNodes(node.getRight());
    }
}
class Node {
    private int no;
    private String name;
    private Node left;
    private Node right;
    // 0 指向的是子树,1表示指向的是节点
    private int leftType;
    private int rightType;

    public Node(int no, String name) {
        this.no = no;
        this.name = name;
    }
    // 省略get、set
}

标签:Node,node,private,二叉树,root,节点
From: https://www.cnblogs.com/viva-zzt/p/17071021.html

相关文章

  • [数据结构]二叉树的前中后序遍历(递归+迭代实现)
    二叉树的遍历主要的三种遍历方式二叉树主要的遍历方式有前序遍历、中序遍历和后序遍历。(1)前序遍历:根节点-->左子树-->右子树(2)中序遍历:左子树-->根节点-->右子树(3)后序......
  • 力扣257 二叉树的所有路劲
    题目:给你一个二叉树的根节点root,按任意顺序,返回所有从根节点到叶子节点的路径。叶子节点是指没有子节点的节点。示例:输入:root=[1,2,3,null,5]输出:["1->2->......
  • 二叉树遍历 前序 中序 后序
    packagecom.pay.test;importjava.util.LinkedList;publicclassNode{privateIntegerdata;privateNodeleft;privateNoderight;publ......
  • 力扣110 平衡二叉树
    题目:给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点的左右两个子树的高度差的绝对值不超过1。示例:输入:root......
  • 力扣222 完全二叉树
    题目:给你一棵完全二叉树的根节点root,求出该树的节点个数。完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面......
  • 代码随想录算法训练营第15天 | 二叉树的层序遍历226. 翻转二叉树 101.对称二叉树
    102.二叉树的层序遍历文章:代码随想录(programmercarl.com)视频:讲透二叉树的层序遍历|广度优先搜索|LeetCode:102.二叉树的层序遍历_哔哩哔哩_bilibili思路:层序遍......
  • 代码随想录算法训练营day14 | leetcode 层序遍历 226.翻转二叉树 101.对称二叉树 2
    层序遍历/***二叉树的层序遍历*/classQueueTraverse{/***存放一层一层的数据*/publicList<List<Integer>>resList=newArrayList<>()......
  • 257. 二叉树的所有路径
    问题描述https://leetcode.cn/problems/binary-tree-paths/description/解题思路叶子结点时,添加到结果序列即可。代码#Definitionforabinarytreenode.#class......
  • 226. 反转二叉树
    问题描述https://leetcode.cn/problems/invert-binary-tree/description/解题思路没啥好说的,python的交换简单极了。代码#Definitionforabinarytreenode.#cl......
  • 144. 二叉树的前序遍历
    问题描述https://leetcode.cn/problems/binary-tree-preorder-traversal/description/解题思路二叉树的先序遍历,没啥好说的。中-左-右。先序中序后序说的是中在哪里。......