zoukankan      html  css  js  c++  java
  • 线索化二叉树

    二叉树的线索化是指给二叉树加左右两个指针域(称为线索),可以提高空间利用率。

    一般先规定好遍历顺序,确定每个结点的前驱和后继 即遍历得到的顺序中前后结点,下面都以中序遍历为例。

    规定:左指针域指向该结点的左子结点(或前驱),右指针指向该结点的右子结点

    中序遍历得到的第一个结点为首结点,前驱为NULL,得到的最后一个结点为尾结点,后继为NULL。

    线索化二叉树的建立代码如下:

     1   public void threadNode(Node node)
     2         {
     3             //leftType,rightType为1则表示左(右)子结点不存在,为前驱(后继)
     4             if (node == null)
     5             {
     6                 return;
     7             }
     8             //线索化左子树
     9             threadNode(node.left);
    10             if (node.left == null)
    11             {
    12                 //让当前结点的左指针指向前驱结点
    13                 node.left = pre;
    14                 node.leftType = 1;
    15             }
    16             if (pre != null && pre.right == null)
    17             {
    18                 //前驱结点右指针指向当前结点
    19                 pre.right = node;
    20                 pre.rightType = 1;
    21             }
    22             //每处理一个结点,前驱结点前进(让前驱结点为当前结点)
    23             pre = node;
    24             threadNode(node.right);
    25         }

    中序遍历线索二叉树:先找到首结点。对于每一个结点,都要判断其左右子结点是否存在,如果存在则继续递归左-中-右

    和中序遍历普通二叉树不同的是,如果不存在左右子结点,则进入其后继结点

    代码如下(尚硅谷老师的遍历代码思想有点难懂,要多看)

     1 public void list()
     2         {
     3             Node node = root;
     4             while (node != null)
     5             {
     6                 //如果结点存在左子结点 则继续往下找
     7                 while (node.leftType == 0)
     8                 {
     9                     node = node.left;
    10                 }//跳出while循环表示得到了一个没有左子结点的结点
    11                 Console.WriteLine(node.tostring());//打印结点
    12                 //如果结点右边不存在子节点,只有后驱结点 则打印后驱结点
    13                 while (node.rightType == 1)
    14                 {
    15                     node = node.right;//结点移到后驱结点
    16                     Console.WriteLine(node.tostring());//打印结点
    17                 }//跳出while循环表示该节点存在右子结点
    18                 node = node.right;//指向结点右子结点
    19             }
    20         }
  • 相关阅读:
    PHP正则表达式
    PHP日期时间处理
    好文摘录
    Unix时间戳与C# DateTime时间类型互换
    dedecms表结构分析
    css默认值汇总
    jQuery offset,position,offsetParent,scrollLeft,scrollTop html控件定位 css position
    html中label宽度设置、非替换元素和替换元素
    css position, display, float 内联元素、块级元素
    CSS技巧(一):清除浮动
  • 原文地址:https://www.cnblogs.com/TheLin/p/13908804.html
Copyright © 2011-2022 走看看