从二叉树改链表引发的递归二三想

递归其实就是寻找通项公式,但是通项公式可以有轻微的区别。

比如二叉树改链表(只调整箭头方向)这件事情,用以下两种方法都可以实现。

方法1: 从根开始 (1)调整左子树 (2)调整右子树  (3)(如何调整)左子树的最大值连接 自身,右子树的最小值连接自身

方法2:从根开始  (1)返回左子树最大值连接自身 (2)返回右子树最小值连接自身 (3)(如何返回值)如果是来自左子树,返回最大值,如果是来自右子树,返回最小值

(4)  递归调整左右子树

进而可以简化为 :

(1)调整左子树,并返回最大值连接自身  (2)调整右子树,并返回最小值连接自身 (3)(如何返回值)如果是来自左子树,返回最大值,如果是来自右子树,返回最小值

总体上,方法1和方法2差别不大,但由于想法的不同,递归函数会有轻微的差别,比如方法1不需要带返回值,方法2则需要返回值。

不过万变不离其宗,递归有一种分而治之的感觉

本来要解决一个大问题    解决(大问题),但是直接将所有实现写在函数体内部可能会比较头疼,于是,将

解决(大问题) 转化为 => 解决 ( 小问题1), 解决 (小问题2),  解决 (小问题3)

而解决小问题又可以进一步的分解为 解决(小小问题1) 解决 (小小问题 2)  解决(小小问题3)

当然,到了这一步还只是相当于将一句大空话分成了几句小空话,没什么营养,最终还是需要的是将具体的解决方案写出来。

然而,当分解达到一定的程度,需要写出的解决方法只是针对一个很小很小的问题,这时就很容易写出了。

到了这一步,还是缺了点意思,就好像把一盒沙子泼在地上,成为一盘散沙,然后根据情况一个一个处理,依然费时费力。

如果,所有的的沙子具有一样的结构,所有的处理方法也有一样的步骤,那么这时就有意思了。

      void fix(main)
        {
            fix1(main_part1);
            fix2(main_part2);
            fix3(main_part3);
        }

        void fix1(main_part1)
        {
            fix11(main_part1_part1);
            fix12(main_part1_part2);
            fix13(main_part1_part3);
        }

        void fix2(main_part2)
        {
            fix21(main_part2_part1);
            fix22(main_part2_part2);
            fix23(main_part2_part3);
        }

        void fix3(main_part3)
        {
            fix31(main_part3_part1);
            fix32(main_part3_part2);
            fix33(main_part3_part3);
        }

当结构一致,方法一致的时候,以上的一堆函数就可以简化为

void fix(main)

{

fix(main_part1);

fix(main_part2);

fix(main_part3);

}

程序突然变得如此的简单。

当我们要处理的对象群具有一致的结构(因此可以实现同样的分割或者递推),而对每个对象的处理的方法又一致的时候,递归往往是不错的选择,可以很好的简化程序。当然,程序是简化了,大量的堆栈资源开销已经可能的重复运算都是在使用递归时需要考虑的问题。比如经典的斐波那契递归解法就并不高校,因为包含了大量的重复计算。这时,使用几个int和for循环来解决就是更好的做法。

最后突然想到,吃拉面的时候,师傅的双手其实就是一个递归函数。将大面团 (1)折叠 (2)拉长 往复循环,最终当面条的韧性和样子达到师傅满意的终止条件时,函数结束。

做面 (面团)

{

做面 (面团-1);

做面 (面团-2);//面团变为面团1和面团2通过折叠实现。各种面团具有一致的结构,因此可以通过重复的折叠方法实现分割。

拍打拉长 ();

}

本文仅是博主无聊时的碎碎想,写得不好的地方,还请轻拍。

从二叉树改链表引发的递归二三想,布布扣,bubuko.com

时间: 2024-09-30 04:49:35

从二叉树改链表引发的递归二三想的相关文章

二叉树的链表实现(递归)

/************************************************************************* File Name: bitree.cpp Author: yubo Mail: [email protected] Created Time: 2014年04月27日 星期日 23时45分04秒 学习重点:结点的定义,使之称为类型,作为形参的类型传递;递归的理解: *****************************************

二叉树的链式存储结构----二叉链表

头文件:head.h #include<string.h> #include<ctype.h> #include<malloc.h> /* malloc()等 */ #include<limits.h> /* INT_MAX等 */ #include<stdio.h> /* EOF(=^Z或F6),NULL */ #include<stdlib.h> /* atoi() */ #include<io.h> /* eof()

二叉树的链表实现

直接上代码: /* 二叉树的链表实现: 以及三种遍历方式: author:天下无双 Date:2014-5-28 Version:2.0 */ #include <iostream> #include <string> typedef int T;//树内节点的数据类型 using namespace std; class BiTree { private: struct BiNode{ T data; BiNode *lchild,*rchild; BiNode(T d){ da

二叉树三种遍历(递归以及非递归实现)

package com.shiyeqiang.tree; import java.util.Stack; public class BiTree { public static void main(String[] args) { // 首先构造叶子节点 BiTree leafA1 = new BiTree(4); BiTree leafA2 = new BiTree(5); BiTree leafB1 = new BiTree(6); BiTree leafB2 = new BiTree(7)

单向链表反转算法——递归版和迭代版

最近在做笔试题时,遇到一道编程题:单向链表反转算法.一时紧张,没写出来就提前交卷了,然而交完卷就想出来了... 最初想出来的是递归版,遗憾的是没能做到尾递归,后来又琢磨出了迭代版.后来用实际编译运行测试了一遍,能正常运行. 递归版的灵感来源于<Haskell 趣学指南>中非常简洁的快速排序算法的实现,其思想是将单向链表分割头部和尾部.其中头部指是链表的第一个节点,尾部是指除去第一个节点后的子链表.通过递归的方法,将子链表继续分割成头部和尾部,直至尾部指剩下一个节点,无法继续分割,然后将头部和尾

二叉树的先序遍历(递归方式)详解

/* * 时间:2015年5月4日09:58:21 * 目的:实现二叉树的先序遍历递归. * 总结和思考!二叉树一般使用链式存储结构 * 如果使用顺序存储方式,除非二叉树是完全二叉树或者满二叉树 * 否则会浪费很多内存空间! */ # include <stdio.h> typedef struct Node{ char data; //数据元素 Node *LChild; //左孩子节点 Node *RChild; //右孩子节点 }BTree; /*递归算法--先序遍历*/ //二叉树的创

【数据结构与算法】二叉树深度遍历(非递归)

据说这个笔试面试的时候非常easy考到,所以写到这里. 图示 代码实现 /** * 源代码名称:TreeIteratorNoRecursion.java * 日期:2014-08-23 * 程序功能:二叉树深度遍历(非递归) * 版权:[email protected] * 作者:A2BGeek */ import java.util.Stack; public class TreeIteratorNoRecursion { class TreeNode<T> { private T mNod

[LeetCode系列] 二叉树最大深度求解问题(C++递归解法)

问: 给定二叉树, 如何计算二叉树最大深度? 算法描述如下: 如果当前节点为空, 返回0(代表此节点下方最大节点数为0) 如果当前节点不为空, 返回(其左子树和右子树下方最大节点数中的最大值+1) 上述算法的精髓在于递归调用中的终止条件. 代码如下: 1 /** 2 * Definition for binary tree 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *right; 7 * TreeNod

二叉树的迭代遍历以及递归遍历

二叉树的前序遍历(递归版): public ArrayList<Integer> inOrder(TreeNode root ){ ArrayList<Integer> result = new ArrayList<Integer>(); if(root == null){ return result; } result.add(root.val); inOrder(root.left);+ inOrder(root.right); return result; } 二