【二叉查找树/leetcode#538】图解Morris保姆级教学

Morris: 二叉树遍历的更好方案

平台:C++

Morris算法是什么

一种用于二叉树的遍历算法,可以将传统的栈遍历和递归遍历带来的最差 O ( n ) O(n) O(n)的空间复杂度降低到 O ( 1 ) O(1) O(1)

Morris’s in General

Morris算法抛弃了栈结构(Stack)来做DFS(Depth First Search),转而利用指针的连接来存取前驱节点

来源题解:Leetcode#538官方题解

给定一个二叉搜索树(Binary Search Tree),把它转换成为累加树(Greater Tree),使得每个节点的值是原来的节点值加上所有大于它的节点值之和。

例如:

输入: 原始二叉搜索树:
              5
            /   \
           2     13

输出: 转换为累加树:
             18
            /   \
          20     13

常规思路

由于给出的是二叉搜索树,右子树节点的值永远大于根节点,因此可以很容易想到中序遍历

【二叉查找树/leetcode#538】图解Morris保姆级教学_第1张图片

遍历得到数组后再逆序相加,再填回原树

逆中序遍历

上面的方法行之有效,但是由于操作繁杂冗余,会消耗大量的时间,因此我们可以把逆序相加与遍历相结合,便诞生了逆中序遍历的方法


Morris

解决了时间复杂度,是否还有优化的可能?
Morris算法就是这把钥匙。

代码概览(C++):


struct TreeNode {
   
      int val;
      TreeNode *left;
      TreeNode *right;
      TreeNode(int x) : val(x)

你可能感兴趣的:(刷题笔记,数据结构,c++,leetcode,算法)