博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
剑指offer:二叉搜索树与双向链表(java)
阅读量:2200 次
发布时间:2019-05-03

本文共 1087 字,大约阅读时间需要 3 分钟。

题目:输入一颗二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建新的结点,只能调整树中结点指针的指向。

比如如下图中的二叉搜索树,则输出转换之后的排序双向链表为:

    由于要求转换之后的链表是排好序的,我们可以中序遍历树的每一个结点,这是因为中序遍历算法的特点是按照从小到大的顺序遍历二叉树的每一个结点。当遍历到根结点的时候,我们把树看成三部分:值为10的结点、根结点为6的左子树、根结点为14的右子树。根据排序链表的定义,值为10的结点将和它左子树最大一个结点链接起来,同时它还将和右子树的最小的结点链接起来。按照中序遍历的顺序,当我们遍历转换到根结点时,它的左子树已经转换成一个排序的链表了,并且处在链表中的最后一个结点是当前值最大的结点。接着我们去遍历转换右子树,并把根结点和右子树中最小的结点链接起来。左、右子树的转换方法相同,很自然地想到可以用递归去做。

public BinaryTreeNode convert(BinaryTreeNode root){          BinaryTreeNode node = null;          convert(root,node);          while(node != null && node.leftNode != null){              node = node.leftNode;          }          return node;      }      public void convert(BinaryTreeNode root,BinaryTreeNode lastNode){          if(root == null)              return;          BinaryTreeNode current = root;          if(current.leftNode != null)              convert(current.leftNode,lastNode);          current.leftNode = lastNode;          if(lastNode != null)              lastNode.rightNode = current;          if(current.rightNode != null)              convert(current.rightNode,lastNode);      }

你可能感兴趣的文章
RNN的高级应用
查看>>
TensorFlow-7-TensorBoard Embedding可视化
查看>>
轻松看懂机器学习十大常用算法
查看>>
一个框架解决几乎所有机器学习问题
查看>>
特征工程怎么做
查看>>
机器学习算法应用中常用技巧-1
查看>>
机器学习算法应用中常用技巧-2
查看>>
通过一个kaggle实例学习解决机器学习问题
查看>>
决策树的python实现
查看>>
Sklearn 快速入门
查看>>
了解 Sklearn 的数据集
查看>>
用ARIMA模型做需求预测
查看>>
推荐系统
查看>>
TensorFlow-11-策略网络
查看>>
浅谈 GBDT
查看>>
如何选择优化器 optimizer
查看>>
一文了解强化学习
查看>>
CART 分类与回归树
查看>>
seq2seq 的 keras 实现
查看>>
seq2seq 入门
查看>>