本文是旨在实践”用关键变量、循环把握算法”的思路。用以变量为中心的方法把握算法,取而代之空间想象推演的方法
1.把二元查找树转变成排序的双向链表
变量:全局变量head, end
算法框架: 中序遍历。
变量算法:1) head变量:如果head为null, head指向当前结点,只执行一次。
2) end 变量: 如果end为null, end 指向当前节点;否则end->right 指向当前结点,当前结点的left指向end。end 赋值当前结点2.设计包含min函数的栈
变量:内置一个一般stack1, 正常存取数据。另设一个stack2,栈顶保存stack1当前状态对应的最小值。push算法:stack2为空,stack2 push当前值;否则比较stack2.peek()和当前值,如果当前值小于stack2.peek(),stack2 push当前值。
pop算法:pop出的值和stack2栈顶比较,如果不等于stack2栈顶的值,stack2不做操作。如果等于stack2栈顶的值,stack2也pop
min算法:返回stack2.peek()
4.在二元树中找出和为某一值的所有路径(树)
变量:参数root, sum。另设一个全局变量path vector保存从根节点到当前结点的路径
算法框架:前序遍历。
访问结点算法:path append当前结点,sum 减去当前结点的值。如果sum 为0,打印path
当前树处理完后,path remove当前结点
5.查找最小的k个元素
变量:参数:数组a, 数组大小n, k
算法框架:前k个数构建大小为k的最大堆,后面的数依次和堆顶比较,如小于堆顶则替换堆顶并fixdown
1) heapfy(a,k) 2)i= k, n-1, 比较,fixdown(a,0,k)
6 判断整数序列是不是二元查找树的后序遍历结果
变量 :参数a[], n;局部变量: 循环变量i,
边界情况:n<=1 返回true
1)i从0到n-2扫描a[], 当a[i]大于等于根a[n-1] 停止; 此时i停留在右子树的第一个结点上
2)verify 右子树值均大于等于a[n-1],否则返回false
3)对左右子树递归调用本算法。注意a,和n的新取值。
7翻转一个句子
变量:参数char* a; 局部变量 :char* p 字符指针,wordStart 指针保存当前word的起始,prev表示上一个字符初始化为NULL
算法:1) 用指针p遍历字符,如果当前字符非空格而下一字符是空格或者结束符,说明是word的最后一个字符,从wordStart到p之间reverse。如果当前字符非空格,prev是 空格,更新wordStart=p。
2)reverse整个字符串。
8 二叉树结点最大距离
maxLen(树)= max( maxLen(左子树),maxLen(右子树),depth(左子树)+ depth(右子树))