Day 19:二元树遍历 Binary Tree Traversal

今天一起来认识二元树的三种遍历方式吧!
但是别急!我们先来认识二元搜寻树BST的定义!

二元搜寻树是一棵二元树,如果不为空(二元树可以为空!)
则须满足:

  1. 左子树所有节点(Nodes)的值都要小於Root
  2. 右子树所有节点(Nodes)的值都要大於或等於Root
  3. 它的左右子树也都要是BST
    https://ithelp.ithome.com.tw/upload/images/20211004/201417290R3eFK1o8f.png

我们以这张图为例
我们预期三种不同的结果如下

  1. 中序 In-order: [1, 2, 10, 15, 20, 20, 22]
  2. 前序 pre-order: [ 20, 10, 2, 1, 15, 20, 22]
  3. 後序 post-order: [1, 2, 15, 10, 22, 20, 20]

我们可以从结果观察到:中序追踪可以恰好得到由小到大排列好的结果!
中序的行为其实就是 “左中右”的感觉
同理
前序 → 中左右
後序 → 左右中
也就是说
"中"就是我们当下拜访到的当下结点,"左"就是左儿子(left child),"右"则是右儿子
有没有发现这三个名称其实是跟去“中”在前中後下去命名的感觉(我都是这样记的~)
/images/emoticon/emoticon07.gif
而它程序码的实现也会是依照着个逻辑下去走!
像是中序追踪,其实就是:

inOrderTraverse(left)
array.append(current.value)
inOrderTraverse(rigtht)

https://ithelp.ithome.com.tw/upload/images/20211004/20141729BrCrKqzG2m.png
以这张图为例,我们一开始从20开始不断往左边走到1,而後发先1没有左子树和右子树,我们就把他加到阵列。
接着退回2,并把2加到阵列,发现2没有右子树又退回去2,继续类似的路径,再退回去10...以此类推。这就是中序追踪的行为!

规则讲到这里我们来挑战题目吧!

/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @return {number[]}
 */
    
function inOrderTraverse(tree, array) {
  if(tree !== null ){
		inOrderTraverse(tree.left, array);
		array.push(tree.val);
		inOrderTraverse(tree.right, array);
	}
	return array;
}

var inorderTraversal = function(root) {
    const array = [] ;
    if(!root) return array;
    inOrderTraverse(root,array);
	return array;
};

做完inorder的题目,别忘了自己推一下preorder以及postorder,也都是leetCode里面的题目喔!
今天等於完成了三题!/images/emoticon/emoticon01.gif
下面作法


function preOrderTraverse(tree, array) {
    if(tree !== null ){
		array.push(tree.value);
		preOrderTraverse(tree.left, array);
		preOrderTraverse(tree.right, array);
	}
	return array;
}

function postOrderTraverse(tree, array) {
  if(tree !== null ){
		postOrderTraverse(tree.left, array);
		postOrderTraverse(tree.right, array);
		array.push(tree.value);
	}
	return array;
}

明日预告: 认识了前中後序的走访,来试试实作深度追踪吧!


<<:  18. 订OKRs新手常见错误

>>:  DAY22: 为甚麽要模组化?

Day.5 「我的样式失灵啦!你有头绪吗?」 —— CSS 选择器 与 权重

了解盒模型後,就要为标签套上各种花样了,上一篇介绍了简单的套用方法,但这个套用方法其实不太好用! ...

Firebase Web的小功能分享 (1)

由於很多人都写了要怎麽创建专案、开启专案,这边就来分享一下我写的一些小功能: 上传档案後制作超连结下...

[教学] 如何架设狗狗币全节点 (更新 1.14.4 系统)

此时新版本为 1.14.5, 所以在2021/11/9时 有更新文章部分内容。 为什麽要架设狗狗币全...

iOS App开发 OC 第三天, 记忆体管理

tags: OC 30 day 原文位置网址 Objective-C里的记忆体管理主要有两种: Ga...

[Day 4] 怎麽挑选作品集的主题 - Open API介绍

今天来聊一聊 怎麽挑选作品集的主题 老实说主题我其实想蛮久的, 想得出来的不一定做得到, 做得出来又...