菜鸡的算法修炼:二叉搜索树(二叉搜索树与双向链表)

栏目: IT技术 · 发布时间: 4年前

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

题目描述(引自剑指offer)

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

菜鸡与大佬的对话

菜鸡的算法修炼:二叉搜索树(二叉搜索树与双向链表)

菜鸡修炼坊

数据结构

树是由n(n>=0)个有限节点组成一个具有层次关系的集合。满足以下特点:

①每个元素称为结点;

②没有父结点的结点称为根结点;

③除根结点之外的其余数据元素被分为m(m≥0)个互不相交的集合T0,T1,T2,……,Tm-1,其中每一个集合Ti(1<=i<=m)本身也是一棵树,被称作原树的子树。

二叉树是每个结点最多有两个子树的树结构。

二叉搜索树

二叉搜索树,它或者是一棵空树,或者是具有下列性质的二叉树:若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;它的左、右子树也分别为二叉搜索树。

题目分析

在了解二叉搜索树的定义之后,菜鸡觉得可以用递归和非递归两种方式来解决。首先考虑递归的方式,首先一个结点的引用标记,然后按照右子树,根,左子树的顺序进行遍历,在遍历的过程中调整指针的指向,并移动引用标记,最后就能得到排序的双向链表,标记引用的就是双向链表的头结点(最小结点)。其次考虑非递归的方式,同样的原理,只不过需要借助栈的数据结构来进行操作。菜鸡理顺思路之后,决定用 Java 代码实现他的心路历程。

代码实现

// 树的定义

public class TreeNode {

int value = 0;

TreeNode left = null;

TreeNode right = null;


public TreeNode(int value) {

this.value = value;

}

}

public class Solution {

// 定义结点引用标记

TreeNode result = null;

// 递归解决方案

public TreeNode convertByRecursion(TreeNode root) {

// 递归出口

if(root == null) return root;

// 递归遍历右子树

convertByRecursion(root.right);

// 找到最右结点,设置引用标记

if(result == null){

result = root;

}

// 非最右结点,调整指针指向,并移动引用标记,逐步串起整个链表

else {

result.left = root;

root.right = result;

result = root;

}

// 递归遍历左子树

convertByRecursion(root.left);

// 返回链表头结点(最小结点)的引用

return result;

}

}

import java.util.Stack;


public class Solution {


// 非递归解决方案

public TreeNode convertByNonRecursion(TreeNode root) {

// 空树直接返回

if(root == null) return root;

// 定义结点引用标记

TreeNode result = null;

// 申请辅助栈

Stack<TreeNode> stack = new Stack<>();

while(root != null || !stack.isEmpty()){

// 遍历右子树

if(root != null) {

stack.push(root);

root = root.right;

}

else {

root = stack.pop();

// 找到最右结点,设置引用标记

if(result == null) {

result = root;

}

// 非最右结点,调整指针指向,并移动引用标记,逐步串起整个链表

else {

result.left = root;

root.right = result;

result = root;

}

// 遍历左子树

root = root.left;

}

}

// 返回链表头结点(最小结点)的引用

return result;

}

}

经过这次修炼,菜鸡对树型结构有了一定的了解,菜鸡发现像链表,树这样递归定义的数据结构,在很多问题上都可以考虑递归的方式去解决。另外,菜鸡还掌握了二叉搜索树的特性,他发现,二叉搜索树在平面上的投影,其实就是有序的线性表。菜鸡越发体会到了基础知识的重要性,也越发体会到活学活用的重要性。菜鸡隐隐察觉到,修炼的终极产物是思想……

菜鸡的算法修炼:二叉搜索树(二叉搜索树与双向链表)


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

PWA实战

PWA实战

[美]Dean Alan Hume / 郑丰彧 / 电子工业出版社 / 2018-6 / 69

Progressive Web App(PWA)是由谷歌提出的一整套技术解决方案,它致力于为 Web 提供出色的用户体验,并完美体现了渐进增强原则。作为为数不多的实战入门用书,《PWA 实战:面向下一代的Progressive Web App》旨在通过大量清晰示例来介绍 PWA 的主要特性。全书一共由五个部分组成:第一部分介绍 PWA 的概念及解锁 PWA 应用的关键—Service Worker......一起来看看 《PWA实战》 这本书的介绍吧!

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具