<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>archive</title><link>https://archive-w.netlify.app/algo/tree/</link><description>Recent content on archive</description><generator>Hugo</generator><language>zh-CN</language><atom:link href="https://archive-w.netlify.app/algo/tree/index.xml" rel="self" type="application/rss+xml"/><item><title/><link>https://archive-w.netlify.app/algo/tree/01-binary-tree/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://archive-w.netlify.app/algo/tree/01-binary-tree/</guid><description>&lt;ul>
&lt;li>
&lt;h2 id="introbinarytree">
 Intro(BinaryTree)
 &lt;a class="anchor" href="#introbinarytree">#&lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>
&lt;h3 id="二叉树">
 二叉树
 &lt;a class="anchor" href="#%e4%ba%8c%e5%8f%89%e6%a0%91">#&lt;/a>
&lt;/h3>
&lt;ul>
&lt;li>
&lt;h4 id="定义">
 定义
 &lt;a class="anchor" href="#%e5%ae%9a%e4%b9%89">#&lt;/a>
&lt;/h4>
&lt;p class="tip">二叉树的每个结点至多只有二棵子树(不存在度大于2的结点)，二叉树的子树有左右之分，次序不能颠倒。二叉树的第i层至多有2i-1个结点；深度为k的二叉树至多有2k-1个结点；对任何一棵二叉树T，如果其终端结点数为n0，度为2的结点数为n2，则n0=n2+1。&lt;/p>
&lt;/li>
&lt;li>
&lt;h4 id="性质">
 性质
 &lt;a class="anchor" href="#%e6%80%a7%e8%b4%a8">#&lt;/a>
&lt;/h4>
&lt;p class="warn">1). 在非空二叉树中，第i层的结点总数不超过2i-1, i&amp;gt;=1;
&lt;br>2) 深度为h的二叉树最多有2h-1个结点(h&amp;gt;=1)，最少有h个结点;
&lt;br>3). 对于任意一棵二叉树，如果其叶结点数为N0，而度数为2的结点总数为N2，则N0=N2+1;
&lt;br>4). 具有n个结点的完全二叉树的深度为log2(n+1);
&lt;br>5). 有N个结点的完全二叉树各结点如果用顺序方式存储，则结点之间有如下关系：
&lt;br>    若I为结点编号则 如果I&amp;gt;1，则其父结点的编号为I/2；
&lt;br>    如果2I&amp;lt;=N，则其左儿子（即左子树的根结点）的编号为2I；若2I&amp;gt;N，则无左儿子；
&lt;br>    如果2I+1&amp;lt;=N，则其右儿子的结点编号为2I+1；若2I+1&amp;gt;N，则无右儿子。
&lt;br>6). 给定N个节点，能构成h(N)种不同的二叉树，其中h(N)为卡特兰数的第N项，h(n)=C(2*n, n)/(n+1)。
&lt;br>7). 设有i个枝点，I为所有枝点的道路长度总和，J为叶的道路长度总和J=I+2i。&lt;/p>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;h3 id="满二叉树">
 满二叉树
 &lt;a class="anchor" href="#%e6%bb%a1%e4%ba%8c%e5%8f%89%e6%a0%91">#&lt;/a>
&lt;/h3>
&lt;ul>
&lt;li>
&lt;h4 id="定义-1">
 定义
 &lt;a class="anchor" href="#%e5%ae%9a%e4%b9%89-1">#&lt;/a>
&lt;/h4>
&lt;p class="tip">除最后一层无任何子节点外，每一层上的所有结点都有两个子结点。也可以这样理解，除叶子结点外的所有结点均有两个子结点。节点数达到最大值，所有叶子结点必须在同一层上。&lt;/p>
&lt;/li>
&lt;li>
&lt;h4 id="性质-1">
 性质
 &lt;a class="anchor" href="#%e6%80%a7%e8%b4%a8-1">#&lt;/a>
&lt;/h4>
&lt;p class="warn">1) 一颗树深度为h，最大层数为k，深度与最大层数相同，k=h;
&lt;br>2). 叶子数为2h;
&lt;br>3). 第k层的结点数是：2k-1;
&lt;br>4). 总结点数是：2k-1，且总节点数一定是奇数。&lt;/p>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;h3 id="完全二叉树">
 完全二叉树
 &lt;a class="anchor" href="#%e5%ae%8c%e5%85%a8%e4%ba%8c%e5%8f%89%e6%a0%91">#&lt;/a>
&lt;/h3>
&lt;ul>
&lt;li>
&lt;h4 id="定义-2">
 定义
 &lt;a class="anchor" href="#%e5%ae%9a%e4%b9%89-2">#&lt;/a>
&lt;/h4>
&lt;p class="tip">若设二叉树的深度为h，除第 h 层外，其它各层 (1～(h-1)层) 的结点数都达到最大个数，第h层所有的结点都连续集中在最左边，这就是完全二叉树。
&lt;br>&lt;br>完全二叉树是效率很高的数据结构，堆是一种完全二叉树或者近似完全二叉树，所以效率极高，像十分常用的排序算法、Dijkstra算法、Prim算法等都要用堆才能优化，二叉排序树的效率也要借助平衡性来提高，而平衡性基于完全二叉树。&lt;/p>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;h3 id="示例">
 示例
 &lt;a class="anchor" href="#%e7%a4%ba%e4%be%8b">#&lt;/a>
&lt;/h3>
&lt;p>&lt;img src="https://archive-w.netlify.app/.images/algo/tree/tree-binary-01.png" alt="" width="20%">
&lt;img src="https://archive-w.netlify.app/.images/algo/tree/tree-binary-02.png" alt="" width="32%">
&lt;img src="https://archive-w.netlify.app/.images/algo/tree/tree-binary-03.png" alt="" width="33%">&lt;/p>
&lt;/li>
&lt;li>
&lt;h3 id="线索化二叉树">
 线索化二叉树
 &lt;a class="anchor" href="#%e7%ba%bf%e7%b4%a2%e5%8c%96%e4%ba%8c%e5%8f%89%e6%a0%91">#&lt;/a>
&lt;/h3>
&lt;p class="warn">


 &lt;a href="https://zh.wikipedia.org/wiki/线索二叉树" rel="noopener" target="_blank">wiki&lt;/a>: 在计算机科学中，线索二叉树（或称引线二叉树）是添加了直接指向节点的前驱和后继的指针的二叉树。&lt;/p> &lt;div class="docsify-example-panels"> &lt;div class="docsify-example-panel title-panel">
&lt;h4 id="图解与代码">
 图解与代码
 &lt;a class="anchor" href="#%e5%9b%be%e8%a7%a3%e4%b8%8e%e4%bb%a3%e7%a0%81">#&lt;/a>
&lt;/h4>&lt;/div>
 &lt;div class="docsify-example-panel left-panel"style="max-width: 43%; width: 43%;">
&lt;p>&lt;img src="https://archive-w.netlify.app/.images/algo/tree/tree-threaded-binary-01.png" alt="">&lt;/p></description></item><item><title/><link>https://archive-w.netlify.app/algo/tree/03-01-AVL-tree/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://archive-w.netlify.app/algo/tree/03-01-AVL-tree/</guid><description>&lt;ul>
&lt;li>
&lt;h2 id="introavl">
 Intro(AVL)
 &lt;a class="anchor" href="#introavl">#&lt;/a>
&lt;/h2>
&lt;p class="tip">&lt;code>平衡二叉树&lt;/code>又称&lt;code>AVL树&lt;/code>。它可以是一颗空树，或者具有以下性质的二叉排序树：它的左子树和右子树的高度之差(&lt;code>平衡因子&lt;/code>)的绝对值不超过1且它的左子树和右子树都是一颗平衡二叉树。因此它也被称为高度平衡树。
&lt;br>查找、插入和删除在平均和最坏情况下的时间复杂度都是 &lt;span class="math inline">\({\color{red}O(\log_2 N)}\)&lt;/span>。增加和删除元素的操作则可能需要借由一次或多次树旋转，以实现树的重新平衡。
&lt;br>AVL 树得名于它的发明者 G. M. Adelson-Velsky 和 Evgenii Landis，他们在1962年的论文《An algorithm for the organization of information》中公开了这一数据结构。&lt;/p>
&lt;ul>
&lt;li>
&lt;h3 id="来源">
 来源
 &lt;a class="anchor" href="#%e6%9d%a5%e6%ba%90">#&lt;/a>
&lt;/h3>
&lt;p class="warn">为什么需要AVL：二叉搜索树一定程度上可以提高搜索效率，但是当原序列有序时，例如序列 A = {1，2，3，4，5，6}，构造二叉搜索树如下图。依据此序列构造的二叉搜索树为右斜树，同时二叉树退化成单链表，搜索效率降低为 &lt;span class="math inline">\({\color{red}O(N)}\)&lt;/span>。&lt;/p>
&lt;p>&lt;img src="https://archive-w.netlify.app/.images/algo/tree/tree-AVL-01.png" alt="" width="30%">
&lt;img src="https://archive-w.netlify.app/.images/algo/tree/tree-AVL-02.png" alt="" width="33%">&lt;/p>
&lt;p class="warn">在此二叉搜索树中查找元素 6 需要查找 6 次。
&lt;br>二叉搜索树的查找效率取决于树的高度，因此保持树的高度最小，即可保证树的查找效率。同样的序列 A，将其改为图右的方式存储，查找元素 6 时只需比较 3 次，查找效率提升一倍。&lt;/p>
&lt;p class="tip">可以看出当节点数目一定，保持树的左右两端保持平衡，树的查找效率最高。这种左右子树的高度相差不超过 1 的树为平衡二叉树。&lt;/p>
&lt;/li>
&lt;li>
&lt;h3 id="定义">
 定义
 &lt;a class="anchor" href="#%e5%ae%9a%e4%b9%89">#&lt;/a>
&lt;/h3>
&lt;p class="warn">简称平衡二叉树。由前苏联的数学家 Adelse-Velskil 和 Landis 在 1962 年提出的高度平衡的二叉树，根据科学家的英文名也称为 AVL 树&lt;/p>
&lt;p>&lt;strong>示例AVL&lt;/strong>.&lt;/p>
&lt;p>&lt;img src="https://archive-w.netlify.app/.images/algo/tree/tree-AVL-03.png" alt="" width="30%">&lt;/p>
&lt;p>&lt;strong>反示例AVL&lt;/strong>.&lt;/p>
&lt;p>&lt;img src="https://archive-w.netlify.app/.images/algo/tree/tree-AVL-no-01.png" alt="" width="30%">
&lt;img src="https://archive-w.netlify.app/.images/algo/tree/tree-AVL-no-02.png" alt="" width="30%">
&lt;img src="https://archive-w.netlify.app/.images/algo/tree/tree-AVL-no-03.png" alt="" width="28%">&lt;/p>
&lt;/li>
&lt;li>
&lt;h3 id="性质">
 性质
 &lt;a class="anchor" href="#%e6%80%a7%e8%b4%a8">#&lt;/a>
&lt;/h3>
&lt;p class="warn">1. 可以是空树。
&lt;br>2. 假如不是空树，任何一个结点的左子树与右子树都是平衡二叉树，并且高度之差的绝对值不超过 1。&lt;/p>
&lt;/li>
&lt;li>
&lt;h3 id="平衡因子">
 平衡因子
 &lt;a class="anchor" href="#%e5%b9%b3%e8%a1%a1%e5%9b%a0%e5%ad%90">#&lt;/a>
&lt;/h3>
&lt;p class="warn">某节点的左子树与右子树的高度(深度)差即为该节点的平衡因子（BF,Balance Factor），平衡二叉树中不存在平衡因子大于 1 的节点。在一棵平衡二叉树中，节点的平衡因子只能取 0 、1 或者 -1 ，分别对应着左右子树等高，左子树比较高，右子树比较高。&lt;/p></description></item><item><title/><link>https://archive-w.netlify.app/algo/tree/03-02-RB-tree/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://archive-w.netlify.app/algo/tree/03-02-RB-tree/</guid><description>&lt;ul>
&lt;li>
&lt;h2 id="introred-black">
 Intro(Red-Black)
 &lt;a class="anchor" href="#introred-black">#&lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>
&lt;h3 id="定义">
 定义
 &lt;a class="anchor" href="#%e5%ae%9a%e4%b9%89">#&lt;/a>
&lt;/h3>
&lt;/li>
&lt;li>
&lt;h3 id="示例">
 示例
 &lt;a class="anchor" href="#%e7%a4%ba%e4%be%8b">#&lt;/a>
&lt;/h3>
&lt;p>&lt;img src="https://archive-w.netlify.app/.images/algo/tree/tree-rb-demo-01.png" alt="" width="99%">&lt;/p>
&lt;/li>
&lt;li>
&lt;h3 id="性质">
 性质
 &lt;a class="anchor" href="#%e6%80%a7%e8%b4%a8">#&lt;/a>
&lt;/h3>
&lt;ol>
&lt;li>每个节点非黑即红。&lt;/li>
&lt;li>根节点是黑色的。&lt;/li>
&lt;li>每个&lt;code>NULL叶结点&lt;/code>是黑色的[示例没画出来]。&lt;/li>
&lt;li>如果一个节点是红色的，那么它的两个子节点都是黑色的。&lt;/li>
&lt;li>从任一节点到叶子节点的所有路径上都包含相同数目的黑色节点(黑高相同)&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>
&lt;h3 id="来源">
 来源
 &lt;a class="anchor" href="#%e6%9d%a5%e6%ba%90">#&lt;/a>
&lt;/h3>
&lt;/li>
&lt;li>
&lt;h3 id="平衡因子">
 平衡因子
 &lt;a class="anchor" href="#%e5%b9%b3%e8%a1%a1%e5%9b%a0%e5%ad%90">#&lt;/a>
&lt;/h3>
&lt;/li>
&lt;li>
&lt;h3 id="平衡">
 平衡
 &lt;a class="anchor" href="#%e5%b9%b3%e8%a1%a1">#&lt;/a>
&lt;/h3>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h2 id="reference">
 Reference
 &lt;a class="anchor" href="#reference">#&lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>


 &lt;a href="https://drive.google.com/file/d/1aZEr0b1O9rww1kvtYZ9v1k3mdLHbwCuA/view?usp=sharing" rel="noopener" target="_blank">https://drive.google.com/file/d/1aZEr0b1O9rww1kvtYZ9v1k3mdLHbwCuA/view?usp=sharing&lt;/a>&lt;/li>
&lt;li>


 &lt;a href="https://blog.csdn.net/silangquan/article/details/18655795" rel="noopener" target="_blank">https://blog.csdn.net/silangquan/article/details/18655795&lt;/a>&lt;/li>
&lt;/ul></description></item></channel></rss>