PHP二叉树(三):红黑树

来源:互联网 发布:单片机输入的是1和0吗 编辑:程序博客网 时间:2024/05/19 02:21

关于红黑树的原理网上的资源就挺多的,而且情况有点小复杂,所以在这里我就不再陈述了,直接上代码吧:

<code class="hljs xml has-numbering"><span class="php"><span class="hljs-comment"><span class="hljs-preprocessor"><?php</span>/** * author:zhongjin * time:2016/10/20 11:53 * description: 红黑树 */</span><span class="hljs-comment">//结点</span><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Node</span>{</span>    <span class="hljs-keyword">public</span> <span class="hljs-variable">$key</span>;    <span class="hljs-keyword">public</span> <span class="hljs-variable">$parent</span>;    <span class="hljs-keyword">public</span> <span class="hljs-variable">$left</span>;    <span class="hljs-keyword">public</span> <span class="hljs-variable">$right</span>;    <span class="hljs-keyword">public</span> <span class="hljs-variable">$IsRed</span>;  <span class="hljs-comment">//分辨红节点或黑节点</span>    <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">__construct</span><span class="hljs-params">(<span class="hljs-variable">$key</span>, <span class="hljs-variable">$IsRed</span> = TRUE)</span>    {</span>        <span class="hljs-variable">$this</span>->key = <span class="hljs-variable">$key</span>;        <span class="hljs-variable">$this</span>-><span class="hljs-keyword">parent</span> = <span class="hljs-keyword">NULL</span>;        <span class="hljs-variable">$this</span>->left = <span class="hljs-keyword">NULL</span>;        <span class="hljs-variable">$this</span>->right = <span class="hljs-keyword">NULL</span>;        <span class="hljs-comment">//插入结点默认是红色</span>        <span class="hljs-variable">$this</span>->IsRed = <span class="hljs-variable">$IsRed</span>;    }}<span class="hljs-comment">//红黑树</span><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Rbt</span>{</span>    <span class="hljs-keyword">public</span> <span class="hljs-variable">$root</span>;    <span class="hljs-comment">/**     * 初始化树结构     *<span class="hljs-phpdoc"> @param</span> $arr 初始化树结构的数组     *<span class="hljs-phpdoc"> @return</span> null     */</span>    <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">init</span><span class="hljs-params">(<span class="hljs-variable">$arr</span>)</span>    {</span>        <span class="hljs-comment">//根节点必须是黑色</span>        <span class="hljs-variable">$this</span>->root = <span class="hljs-keyword">new</span> Node(<span class="hljs-variable">$arr</span>[<span class="hljs-number">0</span>], <span class="hljs-keyword">FALSE</span>);        <span class="hljs-keyword">for</span> (<span class="hljs-variable">$i</span> = <span class="hljs-number">1</span>; <span class="hljs-variable">$i</span> < count(<span class="hljs-variable">$arr</span>); <span class="hljs-variable">$i</span>++) {            <span class="hljs-variable">$this</span>->Insert(<span class="hljs-variable">$arr</span>[<span class="hljs-variable">$i</span>]);        }    }    <span class="hljs-comment">/**     * (对内)中序遍历     *<span class="hljs-phpdoc"> @param</span> $root (树或子树的)根节点     *<span class="hljs-phpdoc"> @return</span> null     */</span>    <span class="hljs-keyword">private</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">mid_order</span><span class="hljs-params">(<span class="hljs-variable">$root</span>)</span>    {</span>        <span class="hljs-keyword">if</span> (<span class="hljs-variable">$root</span> != <span class="hljs-keyword">NULL</span>) {            <span class="hljs-variable">$this</span>->mid_order(<span class="hljs-variable">$root</span>->left);            <span class="hljs-keyword">echo</span> <span class="hljs-variable">$root</span>->key . <span class="hljs-string">"-"</span> . (<span class="hljs-variable">$root</span>->IsRed ? <span class="hljs-string">'r'</span> : <span class="hljs-string">'b'</span>) . <span class="hljs-string">'  '</span>;            <span class="hljs-variable">$this</span>->mid_order(<span class="hljs-variable">$root</span>->right);        }    }    <span class="hljs-comment">/**     * (对外)中序遍历     *<span class="hljs-phpdoc"> @param</span> null     *<span class="hljs-phpdoc"> @return</span> null     */</span>    <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">MidOrder</span><span class="hljs-params">()</span>    {</span>        <span class="hljs-variable">$this</span>->mid_order(<span class="hljs-variable">$this</span>->root);    }    <span class="hljs-comment">/**     * 查找树中是否存在$key对应的节点     *<span class="hljs-phpdoc"> @param</span> $key 待搜索数字     *<span class="hljs-phpdoc"> @return</span> $key对应的节点     */</span>    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">search</span><span class="hljs-params">(<span class="hljs-variable">$key</span>)</span>    {</span>        <span class="hljs-variable">$current</span> = <span class="hljs-variable">$this</span>->root;        <span class="hljs-keyword">while</span> (<span class="hljs-variable">$current</span> != <span class="hljs-keyword">NULL</span>) {            <span class="hljs-keyword">if</span> (<span class="hljs-variable">$current</span>->key == <span class="hljs-variable">$key</span>) {                <span class="hljs-keyword">return</span> <span class="hljs-variable">$current</span>;            } <span class="hljs-keyword">elseif</span> (<span class="hljs-variable">$current</span>->key > <span class="hljs-variable">$key</span>) {                <span class="hljs-variable">$current</span> = <span class="hljs-variable">$current</span>->left;            } <span class="hljs-keyword">else</span> {                <span class="hljs-variable">$current</span> = <span class="hljs-variable">$current</span>->right;            }        }        <span class="hljs-comment">//结点不存在</span>        <span class="hljs-keyword">return</span> <span class="hljs-variable">$current</span>;    }    <span class="hljs-comment">/**     * 将以$root为根节点的最小不平衡二叉树做右旋处理     *<span class="hljs-phpdoc"> @param</span> $root(树或子树)根节点     *<span class="hljs-phpdoc"> @return</span> null     */</span>    <span class="hljs-keyword">private</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">R_Rotate</span><span class="hljs-params">(<span class="hljs-variable">$root</span>)</span>    {</span>        <span class="hljs-variable">$L</span> = <span class="hljs-variable">$root</span>->left;        <span class="hljs-keyword">if</span> (!is_null(<span class="hljs-variable">$root</span>-><span class="hljs-keyword">parent</span>)) {            <span class="hljs-variable">$P</span> = <span class="hljs-variable">$root</span>-><span class="hljs-keyword">parent</span>;            <span class="hljs-keyword">if</span>(<span class="hljs-variable">$root</span> == <span class="hljs-variable">$P</span>->left){                <span class="hljs-variable">$P</span>->left = <span class="hljs-variable">$L</span>;            }<span class="hljs-keyword">else</span>{                <span class="hljs-variable">$P</span>->right = <span class="hljs-variable">$L</span>;            }            <span class="hljs-variable">$L</span>-><span class="hljs-keyword">parent</span> = <span class="hljs-variable">$P</span>;        } <span class="hljs-keyword">else</span> {            <span class="hljs-variable">$L</span>-><span class="hljs-keyword">parent</span> = <span class="hljs-keyword">NULL</span>;        }        <span class="hljs-variable">$root</span>-><span class="hljs-keyword">parent</span> = <span class="hljs-variable">$L</span>;        <span class="hljs-variable">$root</span>->left = <span class="hljs-variable">$L</span>->right;        <span class="hljs-variable">$L</span>->right = <span class="hljs-variable">$root</span>;        <span class="hljs-comment">//这句必须啊!</span>        <span class="hljs-keyword">if</span> (<span class="hljs-variable">$L</span>-><span class="hljs-keyword">parent</span> == <span class="hljs-keyword">NULL</span>) {            <span class="hljs-variable">$this</span>->root = <span class="hljs-variable">$L</span>;        }    }    <span class="hljs-comment">/**     * 将以$root为根节点的最小不平衡二叉树做左旋处理     *<span class="hljs-phpdoc"> @param</span> $root(树或子树)根节点     *<span class="hljs-phpdoc"> @return</span> null     */</span>    <span class="hljs-keyword">private</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">L_Rotate</span><span class="hljs-params">(<span class="hljs-variable">$root</span>)</span>    {</span>        <span class="hljs-variable">$R</span> = <span class="hljs-variable">$root</span>->right;        <span class="hljs-keyword">if</span> (!is_null(<span class="hljs-variable">$root</span>-><span class="hljs-keyword">parent</span>)) {            <span class="hljs-variable">$P</span> = <span class="hljs-variable">$root</span>-><span class="hljs-keyword">parent</span>;            <span class="hljs-keyword">if</span>(<span class="hljs-variable">$root</span> == <span class="hljs-variable">$P</span>->right){                <span class="hljs-variable">$P</span>->right = <span class="hljs-variable">$R</span>;            }<span class="hljs-keyword">else</span>{                <span class="hljs-variable">$P</span>->left = <span class="hljs-variable">$R</span>;            }            <span class="hljs-variable">$R</span>-><span class="hljs-keyword">parent</span> = <span class="hljs-variable">$P</span>;        } <span class="hljs-keyword">else</span> {            <span class="hljs-variable">$R</span>-><span class="hljs-keyword">parent</span> = <span class="hljs-keyword">NULL</span>;        }        <span class="hljs-variable">$root</span>-><span class="hljs-keyword">parent</span> = <span class="hljs-variable">$R</span>;        <span class="hljs-variable">$root</span>->right = <span class="hljs-variable">$R</span>->left;        <span class="hljs-variable">$R</span>->left = <span class="hljs-variable">$root</span>;        <span class="hljs-comment">//这句必须啊!</span>        <span class="hljs-keyword">if</span> (<span class="hljs-variable">$R</span>-><span class="hljs-keyword">parent</span> == <span class="hljs-keyword">NULL</span>) {            <span class="hljs-variable">$this</span>->root = <span class="hljs-variable">$R</span>;        }    }    <span class="hljs-comment">/**     * 查找树中的最小关键字     *<span class="hljs-phpdoc"> @param</span> $root 根节点     *<span class="hljs-phpdoc"> @return</span> 最小关键字对应的节点     */</span>    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">search_min</span><span class="hljs-params">(<span class="hljs-variable">$root</span>)</span>    {</span>        <span class="hljs-variable">$current</span> = <span class="hljs-variable">$root</span>;        <span class="hljs-keyword">while</span> (<span class="hljs-variable">$current</span>->left != <span class="hljs-keyword">NULL</span>) {            <span class="hljs-variable">$current</span> = <span class="hljs-variable">$current</span>->left;        }        <span class="hljs-keyword">return</span> <span class="hljs-variable">$current</span>;    }    <span class="hljs-comment">/**     * 查找树中的最大关键字     *<span class="hljs-phpdoc"> @param</span> $root 根节点     *<span class="hljs-phpdoc"> @return</span> 最大关键字对应的节点     */</span>    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">search_max</span><span class="hljs-params">(<span class="hljs-variable">$root</span>)</span>    {</span>        <span class="hljs-variable">$current</span> = <span class="hljs-variable">$root</span>;        <span class="hljs-keyword">while</span> (<span class="hljs-variable">$current</span>->right != <span class="hljs-keyword">NULL</span>) {            <span class="hljs-variable">$current</span> = <span class="hljs-variable">$current</span>->right;        }        <span class="hljs-keyword">return</span> <span class="hljs-variable">$current</span>;    }    <span class="hljs-comment">/**     * 查找某个$key在中序遍历时的直接前驱节点     *<span class="hljs-phpdoc"> @param</span> $x 待查找前驱节点的节点引用     *<span class="hljs-phpdoc"> @return</span> 前驱节点引用     */</span>    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">predecessor</span><span class="hljs-params">(<span class="hljs-variable">$x</span>)</span>    {</span>        <span class="hljs-comment">//左子节点存在,直接返回左子节点的最右子节点</span>        <span class="hljs-keyword">if</span> (<span class="hljs-variable">$x</span>->left != <span class="hljs-keyword">NULL</span>) {            <span class="hljs-keyword">return</span> <span class="hljs-variable">$this</span>->search_max(<span class="hljs-variable">$x</span>->left);        }        <span class="hljs-comment">//否则查找其父节点,直到当前结点位于父节点的右边</span>        <span class="hljs-variable">$p</span> = <span class="hljs-variable">$x</span>-><span class="hljs-keyword">parent</span>;        <span class="hljs-comment">//如果x是p的左孩子,说明p是x的后继,我们需要找的是p是x的前驱</span>        <span class="hljs-keyword">while</span> (<span class="hljs-variable">$p</span> != <span class="hljs-keyword">NULL</span> && <span class="hljs-variable">$x</span> == <span class="hljs-variable">$p</span>->left) {            <span class="hljs-variable">$x</span> = <span class="hljs-variable">$p</span>;            <span class="hljs-variable">$p</span> = <span class="hljs-variable">$p</span>-><span class="hljs-keyword">parent</span>;        }        <span class="hljs-keyword">return</span> <span class="hljs-variable">$p</span>;    }    <span class="hljs-comment">/**     * 查找某个$key在中序遍历时的直接后继节点     *<span class="hljs-phpdoc"> @param</span> $x 待查找后继节点的节点引用     *<span class="hljs-phpdoc"> @return</span> 后继节点引用     */</span>    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">successor</span><span class="hljs-params">(<span class="hljs-variable">$x</span>)</span>    {</span>        <span class="hljs-keyword">if</span> (<span class="hljs-variable">$x</span>->left != <span class="hljs-keyword">NULL</span>) {            <span class="hljs-keyword">return</span> <span class="hljs-variable">$this</span>->search_min(<span class="hljs-variable">$x</span>->right);        }        <span class="hljs-variable">$p</span> = <span class="hljs-variable">$x</span>-><span class="hljs-keyword">parent</span>;        <span class="hljs-keyword">while</span> (<span class="hljs-variable">$p</span> != <span class="hljs-keyword">NULL</span> && <span class="hljs-variable">$x</span> == <span class="hljs-variable">$p</span>->right) {            <span class="hljs-variable">$x</span> = <span class="hljs-variable">$p</span>;            <span class="hljs-variable">$p</span> = <span class="hljs-variable">$p</span>-><span class="hljs-keyword">parent</span>;        }        <span class="hljs-keyword">return</span> <span class="hljs-variable">$p</span>;    }    <span class="hljs-comment">/**     * 将$key插入树中     *<span class="hljs-phpdoc"> @param</span> $key 待插入树的数字     *<span class="hljs-phpdoc"> @return</span> null     */</span>    <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">Insert</span><span class="hljs-params">(<span class="hljs-variable">$key</span>)</span>    {</span>        <span class="hljs-keyword">if</span> (!is_null(<span class="hljs-variable">$this</span>->search(<span class="hljs-variable">$key</span>))) {            <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> <span class="hljs-keyword">Exception</span>(<span class="hljs-string">'结点'</span> . <span class="hljs-variable">$key</span> . <span class="hljs-string">'已存在,不可插入!'</span>);        }        <span class="hljs-variable">$root</span> = <span class="hljs-variable">$this</span>->root;        <span class="hljs-variable">$inode</span> = <span class="hljs-keyword">new</span> Node(<span class="hljs-variable">$key</span>);        <span class="hljs-variable">$current</span> = <span class="hljs-variable">$root</span>;        <span class="hljs-variable">$prenode</span> = <span class="hljs-keyword">NULL</span>;        <span class="hljs-comment">//为$inode找到合适的插入位置</span>        <span class="hljs-keyword">while</span> (<span class="hljs-variable">$current</span> != <span class="hljs-keyword">NULL</span>) {            <span class="hljs-variable">$prenode</span> = <span class="hljs-variable">$current</span>;            <span class="hljs-keyword">if</span> (<span class="hljs-variable">$current</span>->key > <span class="hljs-variable">$inode</span>->key) {                <span class="hljs-variable">$current</span> = <span class="hljs-variable">$current</span>->left;            } <span class="hljs-keyword">else</span> {                <span class="hljs-variable">$current</span> = <span class="hljs-variable">$current</span>->right;            }        }        <span class="hljs-variable">$inode</span>-><span class="hljs-keyword">parent</span> = <span class="hljs-variable">$prenode</span>;        <span class="hljs-comment">//如果$prenode == NULL, 则证明树是空树</span>        <span class="hljs-keyword">if</span> (<span class="hljs-variable">$prenode</span> == <span class="hljs-keyword">NULL</span>) {            <span class="hljs-variable">$this</span>->root = <span class="hljs-variable">$inode</span>;        } <span class="hljs-keyword">else</span> {            <span class="hljs-keyword">if</span> (<span class="hljs-variable">$inode</span>->key < <span class="hljs-variable">$prenode</span>->key) {                <span class="hljs-variable">$prenode</span>->left = <span class="hljs-variable">$inode</span>;            } <span class="hljs-keyword">else</span> {                <span class="hljs-variable">$prenode</span>->right = <span class="hljs-variable">$inode</span>;            }        }        <span class="hljs-comment">//将它重新修正为一颗红黑树</span>        <span class="hljs-variable">$this</span>->InsertFixUp(<span class="hljs-variable">$inode</span>);    }    <span class="hljs-comment">/**     * 对插入节点的位置及往上的位置进行颜色调整     *<span class="hljs-phpdoc"> @param</span> $inode 插入的节点     *<span class="hljs-phpdoc"> @return</span> null     */</span>    <span class="hljs-keyword">private</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">InsertFixUp</span><span class="hljs-params">(<span class="hljs-variable">$inode</span>)</span>    {</span>        <span class="hljs-comment">//情况一:需要调整条件,父节点存在且父节点的颜色是红色</span>        <span class="hljs-keyword">while</span> ((<span class="hljs-variable">$parent</span> = <span class="hljs-variable">$inode</span>-><span class="hljs-keyword">parent</span>) != <span class="hljs-keyword">NULL</span> && <span class="hljs-variable">$parent</span>->IsRed == <span class="hljs-keyword">TRUE</span>) {            <span class="hljs-comment">//祖父结点:</span>            <span class="hljs-variable">$gparent</span> = <span class="hljs-variable">$parent</span>-><span class="hljs-keyword">parent</span>;            <span class="hljs-comment">//如果父节点是祖父结点的左子结点,下面的else与此相反</span>            <span class="hljs-keyword">if</span> (<span class="hljs-variable">$parent</span> == <span class="hljs-variable">$gparent</span>->left) {                <span class="hljs-comment">//叔叔结点</span>                <span class="hljs-variable">$uncle</span> = <span class="hljs-variable">$gparent</span>->right;                <span class="hljs-comment">//case1:叔叔结点也是红色</span>                <span class="hljs-keyword">if</span> (<span class="hljs-variable">$uncle</span> != <span class="hljs-keyword">NULL</span> && <span class="hljs-variable">$uncle</span>->IsRed == <span class="hljs-keyword">TRUE</span>) {                    <span class="hljs-comment">//将父节点和叔叔结点都涂黑,将祖父结点涂红</span>                    <span class="hljs-variable">$parent</span>->IsRed = <span class="hljs-keyword">FALSE</span>;                    <span class="hljs-variable">$uncle</span>->IsRed = <span class="hljs-keyword">FALSE</span>;                    <span class="hljs-variable">$gparent</span>->IsRed = <span class="hljs-keyword">TRUE</span>;                    <span class="hljs-comment">//将新节点指向祖父节点(现在祖父结点变红,可以看作新节点存在)</span>                    <span class="hljs-variable">$inode</span> = <span class="hljs-variable">$gparent</span>;                    <span class="hljs-comment">//继续while循环,重新判断</span>                    <span class="hljs-keyword">continue</span>;   <span class="hljs-comment">//经过这一步之后,组父节点作为新节点存在(跳到case2)</span>                }                <span class="hljs-comment">//case2:叔叔结点是黑色,且当前结点是右子节点</span>                <span class="hljs-keyword">if</span> (<span class="hljs-variable">$inode</span> == <span class="hljs-variable">$parent</span>->right) {                    <span class="hljs-comment">//以父节点作为旋转结点做左旋转处理</span>                    <span class="hljs-variable">$this</span>->L_Rotate(<span class="hljs-variable">$parent</span>);                    <span class="hljs-comment">//在树中实际上已经转换,但是这里的变量的指向还没交换,</span>                    <span class="hljs-comment">//将父节点和字节调换一下,为下面右旋做准备</span>                    <span class="hljs-variable">$temp</span> = <span class="hljs-variable">$parent</span>;                    <span class="hljs-variable">$parent</span> = <span class="hljs-variable">$inode</span>;                    <span class="hljs-variable">$inode</span> = <span class="hljs-variable">$temp</span>;                }                <span class="hljs-comment">//case3:叔叔结点是黑色,而且当前结点是父节点的左子节点</span>                <span class="hljs-variable">$parent</span>->IsRed = <span class="hljs-keyword">FALSE</span>;                <span class="hljs-variable">$gparent</span>->IsRed = <span class="hljs-keyword">TRUE</span>;                <span class="hljs-variable">$this</span>->R_Rotate(<span class="hljs-variable">$gparent</span>);            } <span class="hljs-comment">//如果父节点是祖父结点的右子结点,与上面完全相反</span>            <span class="hljs-keyword">else</span> {                <span class="hljs-comment">//叔叔结点</span>                <span class="hljs-variable">$uncle</span> = <span class="hljs-variable">$gparent</span>->left;                <span class="hljs-comment">//case1:叔叔结点也是红色</span>                <span class="hljs-keyword">if</span> (<span class="hljs-variable">$uncle</span> != <span class="hljs-keyword">NULL</span> && <span class="hljs-variable">$uncle</span>->IsRed == <span class="hljs-keyword">TRUE</span>) {                    <span class="hljs-comment">//将父节点和叔叔结点都涂黑,将祖父结点涂红</span>                    <span class="hljs-variable">$parent</span>->IsRed = <span class="hljs-keyword">FALSE</span>;                    <span class="hljs-variable">$uncle</span>->IsRed = <span class="hljs-keyword">FALSE</span>;                    <span class="hljs-variable">$gparent</span>->IsRed = <span class="hljs-keyword">TRUE</span>;                    <span class="hljs-comment">//将新节点指向祖父节点(现在祖父结点变红,可以看作新节点存在)</span>                    <span class="hljs-variable">$inode</span> = <span class="hljs-variable">$gparent</span>;                    <span class="hljs-comment">//继续while循环,重新判断</span>                    <span class="hljs-keyword">continue</span>;   <span class="hljs-comment">//经过这一步之后,组父节点作为新节点存在(跳到case2)</span>                }                <span class="hljs-comment">//case2:叔叔结点是黑色,且当前结点是左子节点</span>                <span class="hljs-keyword">if</span> (<span class="hljs-variable">$inode</span> == <span class="hljs-variable">$parent</span>->left) {                    <span class="hljs-comment">//以父节点作为旋转结点做右旋转处理</span>                    <span class="hljs-variable">$this</span>->R_Rotate(<span class="hljs-variable">$parent</span>);                    <span class="hljs-comment">//在树中实际上已经转换,但是这里的变量的指向还没交换,</span>                    <span class="hljs-comment">//将父节点和字节调换一下,为下面右旋做准备</span>                    <span class="hljs-variable">$temp</span> = <span class="hljs-variable">$parent</span>;                    <span class="hljs-variable">$parent</span> = <span class="hljs-variable">$inode</span>;                    <span class="hljs-variable">$inode</span> = <span class="hljs-variable">$temp</span>;                }                <span class="hljs-comment">//case3:叔叔结点是黑色,而且当前结点是父节点的右子节点</span>                <span class="hljs-variable">$parent</span>->IsRed = <span class="hljs-keyword">FALSE</span>;                <span class="hljs-variable">$gparent</span>->IsRed = <span class="hljs-keyword">TRUE</span>;                <span class="hljs-variable">$this</span>->L_Rotate(<span class="hljs-variable">$gparent</span>);            }        }        <span class="hljs-comment">//情况二:原树是根节点(父节点为空),则只需将根节点涂黑</span>        <span class="hljs-keyword">if</span> (<span class="hljs-variable">$inode</span> == <span class="hljs-variable">$this</span>->root) {            <span class="hljs-variable">$this</span>->root->IsRed = <span class="hljs-keyword">FALSE</span>;            <span class="hljs-keyword">return</span>;        }        <span class="hljs-comment">//情况三:插入节点的父节点是黑色,则什么也不用做</span>        <span class="hljs-keyword">if</span> (<span class="hljs-variable">$inode</span>-><span class="hljs-keyword">parent</span> != <span class="hljs-keyword">NULL</span> && <span class="hljs-variable">$inode</span>-><span class="hljs-keyword">parent</span>->IsRed == <span class="hljs-keyword">FALSE</span>) {            <span class="hljs-keyword">return</span>;        }    }    <span class="hljs-comment">/**     * (对外)删除指定节点     *<span class="hljs-phpdoc"> @param</span> $key 删除节点的key值     *<span class="hljs-phpdoc"> @return</span> null     */</span>    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">Delete</span><span class="hljs-params">(<span class="hljs-variable">$key</span>)</span>    {</span>        <span class="hljs-keyword">if</span> (is_null(<span class="hljs-variable">$this</span>->search(<span class="hljs-variable">$key</span>))) {            <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> <span class="hljs-keyword">Exception</span>(<span class="hljs-string">'结点'</span> . <span class="hljs-variable">$key</span> . <span class="hljs-string">"不存在,删除失败!"</span>);        }        <span class="hljs-variable">$dnode</span> = <span class="hljs-variable">$this</span>->search(<span class="hljs-variable">$key</span>);        <span class="hljs-keyword">if</span> (<span class="hljs-variable">$dnode</span>->left == <span class="hljs-keyword">NULL</span> || <span class="hljs-variable">$dnode</span>->right == <span class="hljs-keyword">NULL</span>) { <span class="hljs-comment">#如果待删除结点无子节点或只有一个子节点,则c = dnode</span>            <span class="hljs-variable">$c</span> = <span class="hljs-variable">$dnode</span>;        } <span class="hljs-keyword">else</span> { <span class="hljs-comment">#如果待删除结点有两个子节点,c置为dnode的直接后继,以待最后将待删除结点的值换为其后继的值</span>            <span class="hljs-variable">$c</span> = <span class="hljs-variable">$this</span>->successor(<span class="hljs-variable">$dnode</span>);        }        <span class="hljs-comment">//为了后面颜色处理做准备</span>        <span class="hljs-variable">$parent</span> = <span class="hljs-variable">$c</span>-><span class="hljs-keyword">parent</span>;        <span class="hljs-comment">//无论前面情况如何,到最后c只剩下一边子结点</span>        <span class="hljs-keyword">if</span> (<span class="hljs-variable">$c</span>->left != <span class="hljs-keyword">NULL</span>) {    <span class="hljs-comment">//这里不会出现,除非选择的是删除结点的前驱</span>            <span class="hljs-variable">$s</span> = <span class="hljs-variable">$c</span>->left;        } <span class="hljs-keyword">else</span> {            <span class="hljs-variable">$s</span> = <span class="hljs-variable">$c</span>->right;        }        <span class="hljs-keyword">if</span> (<span class="hljs-variable">$s</span> != <span class="hljs-keyword">NULL</span>) { <span class="hljs-comment">#将c的子节点的父母结点置为c的父母结点,此处c只可能有1个子节点,因为如果c有两个子节点,则c不可能是dnode的直接后继</span>            <span class="hljs-variable">$s</span>-><span class="hljs-keyword">parent</span> = <span class="hljs-variable">$c</span>-><span class="hljs-keyword">parent</span>;        }        <span class="hljs-keyword">if</span> (<span class="hljs-variable">$c</span>-><span class="hljs-keyword">parent</span> == <span class="hljs-keyword">NULL</span>) { <span class="hljs-comment">#如果c的父母为空,说明c=dnode是根节点,删除根节点后直接将根节点置为根节点的子节点,此处dnode是根节点,且拥有两个子节点,则c是dnode的后继结点,c的父母就不会为空,就不会进入这个if</span>            <span class="hljs-variable">$this</span>->root = <span class="hljs-variable">$s</span>;        } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (<span class="hljs-variable">$c</span> == <span class="hljs-variable">$c</span>-><span class="hljs-keyword">parent</span>->left) { <span class="hljs-comment">#如果c是其父节点的左右子节点,则将c父母的左右子节点置为c的左右子节点</span>            <span class="hljs-variable">$c</span>-><span class="hljs-keyword">parent</span>->left = <span class="hljs-variable">$s</span>;        } <span class="hljs-keyword">else</span> {            <span class="hljs-variable">$c</span>-><span class="hljs-keyword">parent</span>->right = <span class="hljs-variable">$s</span>;        }        <span class="hljs-variable">$dnode</span>->key = <span class="hljs-variable">$c</span>->key;        <span class="hljs-variable">$node</span> = <span class="hljs-variable">$s</span>;        <span class="hljs-comment">//c的结点颜色是黑色,那么会影响路径上的黑色结点的数量,必须进行调整</span>        <span class="hljs-keyword">if</span> (<span class="hljs-variable">$c</span>->IsRed == <span class="hljs-keyword">FALSE</span>) {            <span class="hljs-variable">$this</span>->DeleteFixUp(<span class="hljs-variable">$node</span>,<span class="hljs-variable">$parent</span>);        }    }    <span class="hljs-comment">/**     * 删除节点后对接点周围的其他节点进行调整     *<span class="hljs-phpdoc"> @param</span> $key 删除节点的子节点和父节点     *<span class="hljs-phpdoc"> @return</span> null     */</span>    <span class="hljs-keyword">private</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">DeleteFixUp</span><span class="hljs-params">(<span class="hljs-variable">$node</span>,<span class="hljs-variable">$parent</span>)</span>    {</span>        <span class="hljs-comment">//如果待删结点的子节点为红色,直接将子节点涂黑</span>        <span class="hljs-keyword">if</span> (<span class="hljs-variable">$node</span> != <span class="hljs-keyword">NULL</span> && <span class="hljs-variable">$node</span>->IsRed == <span class="hljs-keyword">TRUE</span>) {            <span class="hljs-variable">$node</span>->IsRed = <span class="hljs-keyword">FALSE</span>;            <span class="hljs-keyword">return</span>;        }        <span class="hljs-comment">//如果是根节点,那就直接将根节点置为黑色即可</span>        <span class="hljs-keyword">while</span> ((<span class="hljs-variable">$node</span> == <span class="hljs-keyword">NULL</span> || <span class="hljs-variable">$node</span>->IsRed == <span class="hljs-keyword">FALSE</span>) && (<span class="hljs-variable">$node</span> != <span class="hljs-variable">$this</span>->root)) {            <span class="hljs-comment">//node是父节点的左子节点,下面else与这里相反</span>            <span class="hljs-keyword">if</span> (<span class="hljs-variable">$node</span> == <span class="hljs-variable">$parent</span>->left) {                <span class="hljs-variable">$brother</span> = <span class="hljs-variable">$parent</span>->right;                <span class="hljs-comment">//case1:兄弟结点颜色是红色(父节点和兄弟孩子结点都是黑色)</span>                <span class="hljs-comment">//将父节点涂红,将兄弟结点涂黑,然后对父节点进行左旋处理(经过这一步,情况转换为兄弟结点颜色为黑色的情况)</span>                <span class="hljs-keyword">if</span> (<span class="hljs-variable">$brother</span>->IsRed == <span class="hljs-keyword">TRUE</span>) {                    <span class="hljs-variable">$brother</span>->IsRed = <span class="hljs-keyword">FALSE</span>;                    <span class="hljs-variable">$parent</span>->IsRed = <span class="hljs-keyword">TRUE</span>;                    <span class="hljs-variable">$this</span>->L_Rotate(<span class="hljs-variable">$parent</span>);                    <span class="hljs-comment">//将情况转化为其他的情况</span>                    <span class="hljs-variable">$brother</span> = <span class="hljs-variable">$parent</span>->right;  <span class="hljs-comment">//在左旋处理后,$parent->right指向的是原来兄弟结点的左子节点</span>                }                <span class="hljs-comment">//以下是兄弟结点为黑色的情况</span>                <span class="hljs-comment">//case2:兄弟结点是黑色,且兄弟结点的两个子节点都是黑色</span>                <span class="hljs-comment">//将兄弟结点涂红,将当前结点指向其父节点,将其父节点指向当前结点的祖父结点。</span>                <span class="hljs-keyword">if</span> ((<span class="hljs-variable">$brother</span>->left == <span class="hljs-keyword">NULL</span> || <span class="hljs-variable">$brother</span>->left->IsRed == <span class="hljs-keyword">FALSE</span>) && (<span class="hljs-variable">$brother</span>->right == <span class="hljs-keyword">NULL</span> || <span class="hljs-variable">$brother</span>->right->IsRed == <span class="hljs-keyword">FALSE</span>)) {                    <span class="hljs-variable">$brother</span>->IsRed = <span class="hljs-keyword">TRUE</span>;                    <span class="hljs-variable">$node</span> = <span class="hljs-variable">$parent</span>;                    <span class="hljs-variable">$parent</span> = <span class="hljs-variable">$node</span>-><span class="hljs-keyword">parent</span>;                } <span class="hljs-keyword">else</span> {                    <span class="hljs-comment">//case3:兄弟结点是黑色,兄弟结点的左子节点是红色,右子节点为黑色</span>                    <span class="hljs-comment">//将兄弟结点涂红,将兄弟节点的左子节点涂黑,然后对兄弟结点做右旋处理(经过这一步,情况转换为兄弟结点颜色为黑色,右子节点为红色的情况)</span>                    <span class="hljs-keyword">if</span> (<span class="hljs-variable">$brother</span>->right == <span class="hljs-keyword">NULL</span> || <span class="hljs-variable">$brother</span>->right->IsRed == <span class="hljs-keyword">FALSE</span>) {                        <span class="hljs-variable">$brother</span>->IsRed = <span class="hljs-keyword">TRUE</span>;                        <span class="hljs-variable">$brother</span>->left->IsRed = <span class="hljs-keyword">FALSE</span>;                        <span class="hljs-variable">$this</span>->R_Rotate(<span class="hljs-variable">$brother</span>);                        <span class="hljs-comment">//将情况转换为其他情况</span>                        <span class="hljs-variable">$brother</span> = <span class="hljs-variable">$parent</span>->right;                    }                    <span class="hljs-comment">//case4:兄弟结点是黑色,且兄弟结点的右子节点为红色,左子节点为任意颜色</span>                    <span class="hljs-comment">//将兄弟节点涂成父节点的颜色,再把父节点涂黑,将兄弟结点的右子节点涂黑,然后对父节点做左旋处理</span>                    <span class="hljs-variable">$brother</span>->IsRed = <span class="hljs-variable">$parent</span>->IsRed;                    <span class="hljs-variable">$parent</span>->IsRed = <span class="hljs-keyword">FALSE</span>;                    <span class="hljs-variable">$brother</span>->right->IsRed = <span class="hljs-keyword">FALSE</span>;                    <span class="hljs-variable">$this</span>->L_Rotate(<span class="hljs-variable">$parent</span>);                    <span class="hljs-comment">//到了第四种情况,已经是最基本的情况了,可以直接退出了</span>                    <span class="hljs-variable">$node</span> = <span class="hljs-variable">$this</span>->root;                    <span class="hljs-keyword">break</span>;                }            } <span class="hljs-comment">//node是父节点的右子节点</span>            <span class="hljs-keyword">else</span> {                <span class="hljs-variable">$brother</span> = <span class="hljs-variable">$parent</span>->left;                <span class="hljs-comment">//case1:兄弟结点颜色是红色(父节点和兄弟孩子结点都是黑色)</span>                <span class="hljs-comment">//将父节点涂红,将兄弟结点涂黑,然后对父节点进行右旋处理(经过这一步,情况转换为兄弟结点颜色为黑色的情况)</span>                <span class="hljs-keyword">if</span> (<span class="hljs-variable">$brother</span>->IsRed == <span class="hljs-keyword">TRUE</span>) {                    <span class="hljs-variable">$brother</span>->IsRed = <span class="hljs-keyword">FALSE</span>;                    <span class="hljs-variable">$parent</span>->IsRed = <span class="hljs-keyword">TRUE</span>;                    <span class="hljs-variable">$this</span>->R_Rotate(<span class="hljs-variable">$parent</span>);                    <span class="hljs-comment">//将情况转化为其他的情况</span>                    <span class="hljs-variable">$brother</span> = <span class="hljs-variable">$parent</span>->left;  <span class="hljs-comment">//在右旋处理后,$parent->left指向的是原来兄弟结点的右子节点</span>                }                <span class="hljs-comment">//以下是兄弟结点为黑色的情况</span>                <span class="hljs-comment">//case2:兄弟结点是黑色,且兄弟结点的两个子节点都是黑色</span>                <span class="hljs-comment">//将兄弟结点涂红,将当前结点指向其父节点,将其父节点指向当前结点的祖父结点。</span>                <span class="hljs-keyword">if</span> ((<span class="hljs-variable">$brother</span>->left == <span class="hljs-keyword">NULL</span> || <span class="hljs-variable">$brother</span>->left->IsRed == <span class="hljs-keyword">FALSE</span>) && (<span class="hljs-variable">$brother</span>->right == <span class="hljs-keyword">NULL</span> || <span class="hljs-variable">$brother</span>->right->IsRed == <span class="hljs-keyword">FALSE</span>)) {                    <span class="hljs-variable">$brother</span>->IsRed = <span class="hljs-keyword">TRUE</span>;                    <span class="hljs-variable">$node</span> = <span class="hljs-variable">$parent</span>;                    <span class="hljs-variable">$parent</span> = <span class="hljs-variable">$node</span>-><span class="hljs-keyword">parent</span>;                } <span class="hljs-keyword">else</span> {                    <span class="hljs-comment">//case3:兄弟结点是黑色,兄弟结点的右子节点是红色,左子节点为黑色</span>                    <span class="hljs-comment">//将兄弟结点涂红,将兄弟节点的左子节点涂黑,然后对兄弟结点做左旋处理(经过这一步,情况转换为兄弟结点颜色为黑色,右子节点为红色的情况)</span>                    <span class="hljs-keyword">if</span> (<span class="hljs-variable">$brother</span>->left == <span class="hljs-keyword">NULL</span> || <span class="hljs-variable">$brother</span>->left->IsRed == <span class="hljs-keyword">FALSE</span>) {                        <span class="hljs-variable">$brother</span>->IsRed = <span class="hljs-keyword">TRUE</span>;                        <span class="hljs-variable">$brother</span>->right = <span class="hljs-keyword">FALSE</span>;                        <span class="hljs-variable">$this</span>->L_Rotate(<span class="hljs-variable">$brother</span>);                        <span class="hljs-comment">//将情况转换为其他情况</span>                        <span class="hljs-variable">$brother</span> = <span class="hljs-variable">$parent</span>->left;                    }                    <span class="hljs-comment">//case4:兄弟结点是黑色,且兄弟结点的左子节点为红色,右子节点为任意颜色</span>                    <span class="hljs-comment">//将兄弟节点涂成父节点的颜色,再把父节点涂黑,将兄弟结点的右子节点涂黑,然后对父节点左左旋处理</span>                    <span class="hljs-variable">$brother</span>->IsRed = <span class="hljs-variable">$parent</span>->IsRed;                    <span class="hljs-variable">$parent</span>->IsRed = <span class="hljs-keyword">FALSE</span>;                    <span class="hljs-variable">$brother</span>->left->IsRed = <span class="hljs-keyword">FALSE</span>;                    <span class="hljs-variable">$this</span>->R_Rotate(<span class="hljs-variable">$parent</span>);                    <span class="hljs-variable">$node</span> = <span class="hljs-variable">$this</span>->root;                    <span class="hljs-keyword">break</span>;                }            }        }        <span class="hljs-keyword">if</span> (<span class="hljs-variable">$node</span> != <span class="hljs-keyword">NULL</span>) {            <span class="hljs-variable">$this</span>->root->IsRed = <span class="hljs-keyword">FALSE</span>;        }    }    <span class="hljs-comment">/**     * (对内)获取树的深度     *<span class="hljs-phpdoc"> @param</span> $root 根节点     *<span class="hljs-phpdoc"> @return</span> 树的深度     */</span>    <span class="hljs-keyword">private</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">getdepth</span><span class="hljs-params">(<span class="hljs-variable">$root</span>)</span>    {</span>        <span class="hljs-keyword">if</span> (<span class="hljs-variable">$root</span> == <span class="hljs-keyword">NULL</span>) {            <span class="hljs-keyword">return</span> <span class="hljs-number">0</span>;        }        <span class="hljs-variable">$dl</span> = <span class="hljs-variable">$this</span>->getdepth(<span class="hljs-variable">$root</span>->left);        <span class="hljs-variable">$dr</span> = <span class="hljs-variable">$this</span>->getdepth(<span class="hljs-variable">$root</span>->right);        <span class="hljs-keyword">return</span> (<span class="hljs-variable">$dl</span> > <span class="hljs-variable">$dr</span> ? <span class="hljs-variable">$dl</span> : <span class="hljs-variable">$dr</span>) + <span class="hljs-number">1</span>;    }    <span class="hljs-comment">/**     * (对外)获取树的深度     *<span class="hljs-phpdoc"> @param</span> null     *<span class="hljs-phpdoc"> @return</span> null     */</span>    <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">Depth</span><span class="hljs-params">()</span>    {</span>        <span class="hljs-keyword">return</span> <span class="hljs-variable">$this</span>->getdepth(<span class="hljs-variable">$this</span>->root);    }}</span></code><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li><li>42</li><li>43</li><li>44</li><li>45</li><li>46</li><li>47</li><li>48</li><li>49</li><li>50</li><li>51</li><li>52</li><li>53</li><li>54</li><li>55</li><li>56</li><li>57</li><li>58</li><li>59</li><li>60</li><li>61</li><li>62</li><li>63</li><li>64</li><li>65</li><li>66</li><li>67</li><li>68</li><li>69</li><li>70</li><li>71</li><li>72</li><li>73</li><li>74</li><li>75</li><li>76</li><li>77</li><li>78</li><li>79</li><li>80</li><li>81</li><li>82</li><li>83</li><li>84</li><li>85</li><li>86</li><li>87</li><li>88</li><li>89</li><li>90</li><li>91</li><li>92</li><li>93</li><li>94</li><li>95</li><li>96</li><li>97</li><li>98</li><li>99</li><li>100</li><li>101</li><li>102</li><li>103</li><li>104</li><li>105</li><li>106</li><li>107</li><li>108</li><li>109</li><li>110</li><li>111</li><li>112</li><li>113</li><li>114</li><li>115</li><li>116</li><li>117</li><li>118</li><li>119</li><li>120</li><li>121</li><li>122</li><li>123</li><li>124</li><li>125</li><li>126</li><li>127</li><li>128</li><li>129</li><li>130</li><li>131</li><li>132</li><li>133</li><li>134</li><li>135</li><li>136</li><li>137</li><li>138</li><li>139</li><li>140</li><li>141</li><li>142</li><li>143</li><li>144</li><li>145</li><li>146</li><li>147</li><li>148</li><li>149</li><li>150</li><li>151</li><li>152</li><li>153</li><li>154</li><li>155</li><li>156</li><li>157</li><li>158</li><li>159</li><li>160</li><li>161</li><li>162</li><li>163</li><li>164</li><li>165</li><li>166</li><li>167</li><li>168</li><li>169</li><li>170</li><li>171</li><li>172</li><li>173</li><li>174</li><li>175</li><li>176</li><li>177</li><li>178</li><li>179</li><li>180</li><li>181</li><li>182</li><li>183</li><li>184</li><li>185</li><li>186</li><li>187</li><li>188</li><li>189</li><li>190</li><li>191</li><li>192</li><li>193</li><li>194</li><li>195</li><li>196</li><li>197</li><li>198</li><li>199</li><li>200</li><li>201</li><li>202</li><li>203</li><li>204</li><li>205</li><li>206</li><li>207</li><li>208</li><li>209</li><li>210</li><li>211</li><li>212</li><li>213</li><li>214</li><li>215</li><li>216</li><li>217</li><li>218</li><li>219</li><li>220</li><li>221</li><li>222</li><li>223</li><li>224</li><li>225</li><li>226</li><li>227</li><li>228</li><li>229</li><li>230</li><li>231</li><li>232</li><li>233</li><li>234</li><li>235</li><li>236</li><li>237</li><li>238</li><li>239</li><li>240</li><li>241</li><li>242</li><li>243</li><li>244</li><li>245</li><li>246</li><li>247</li><li>248</li><li>249</li><li>250</li><li>251</li><li>252</li><li>253</li><li>254</li><li>255</li><li>256</li><li>257</li><li>258</li><li>259</li><li>260</li><li>261</li><li>262</li><li>263</li><li>264</li><li>265</li><li>266</li><li>267</li><li>268</li><li>269</li><li>270</li><li>271</li><li>272</li><li>273</li><li>274</li><li>275</li><li>276</li><li>277</li><li>278</li><li>279</li><li>280</li><li>281</li><li>282</li><li>283</li><li>284</li><li>285</li><li>286</li><li>287</li><li>288</li><li>289</li><li>290</li><li>291</li><li>292</li><li>293</li><li>294</li><li>295</li><li>296</li><li>297</li><li>298</li><li>299</li><li>300</li><li>301</li><li>302</li><li>303</li><li>304</li><li>305</li><li>306</li><li>307</li><li>308</li><li>309</li><li>310</li><li>311</li><li>312</li><li>313</li><li>314</li><li>315</li><li>316</li><li>317</li><li>318</li><li>319</li><li>320</li><li>321</li><li>322</li><li>323</li><li>324</li><li>325</li><li>326</li><li>327</li><li>328</li><li>329</li><li>330</li><li>331</li><li>332</li><li>333</li><li>334</li><li>335</li><li>336</li><li>337</li><li>338</li><li>339</li><li>340</li><li>341</li><li>342</li><li>343</li><li>344</li><li>345</li><li>346</li><li>347</li><li>348</li><li>349</li><li>350</li><li>351</li><li>352</li><li>353</li><li>354</li><li>355</li><li>356</li><li>357</li><li>358</li><li>359</li><li>360</li><li>361</li><li>362</li><li>363</li><li>364</li><li>365</li><li>366</li><li>367</li><li>368</li><li>369</li><li>370</li><li>371</li><li>372</li><li>373</li><li>374</li><li>375</li><li>376</li><li>377</li><li>378</li><li>379</li><li>380</li><li>381</li><li>382</li><li>383</li><li>384</li><li>385</li><li>386</li><li>387</li><li>388</li><li>389</li><li>390</li><li>391</li><li>392</li><li>393</li><li>394</li><li>395</li><li>396</li><li>397</li><li>398</li><li>399</li><li>400</li><li>401</li><li>402</li><li>403</li><li>404</li><li>405</li><li>406</li><li>407</li><li>408</li><li>409</li><li>410</li><li>411</li><li>412</li><li>413</li><li>414</li><li>415</li><li>416</li><li>417</li><li>418</li><li>419</li><li>420</li><li>421</li><li>422</li><li>423</li><li>424</li><li>425</li><li>426</li><li>427</li><li>428</li><li>429</li><li>430</li><li>431</li><li>432</li><li>433</li><li>434</li><li>435</li><li>436</li><li>437</li><li>438</li><li>439</li><li>440</li><li>441</li><li>442</li><li>443</li><li>444</li><li>445</li><li>446</li><li>447</li><li>448</li><li>449</li><li>450</li><li>451</li><li>452</li><li>453</li><li>454</li><li>455</li><li>456</li><li>457</li><li>458</li><li>459</li><li>460</li><li>461</li><li>462</li><li>463</li><li>464</li><li>465</li><li>466</li><li>467</li><li>468</li><li>469</li><li>470</li><li>471</li><li>472</li><li>473</li><li>474</li><li>475</li><li>476</li><li>477</li><li>478</li><li>479</li><li>480</li><li>481</li><li>482</li><li>483</li><li>484</li><li>485</li><li>486</li><li>487</li><li>488</li><li>489</li><li>490</li><li>491</li><li>492</li><li>493</li><li>494</li><li>495</li><li>496</li><li>497</li><li>498</li><li>499</li><li>500</li><li>501</li><li>502</li><li>503</li><li>504</li><li>505</li><li>506</li><li>507</li><li>508</li><li>509</li><li>510</li><li>511</li><li>512</li><li>513</li><li>514</li><li>515</li><li>516</li><li>517</li><li>518</li><li>519</li><li>520</li><li>521</li><li>522</li><li>523</li><li>524</li><li>525</li><li>526</li><li>527</li><li>528</li><li>529</li></ul><div class="save_code tracking-ad" data-mod="popu_249" style="display: block;"><a target=_blank target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li><li>42</li><li>43</li><li>44</li><li>45</li><li>46</li><li>47</li><li>48</li><li>49</li><li>50</li><li>51</li><li>52</li><li>53</li><li>54</li><li>55</li><li>56</li><li>57</li><li>58</li><li>59</li><li>60</li><li>61</li><li>62</li><li>63</li><li>64</li><li>65</li><li>66</li><li>67</li><li>68</li><li>69</li><li>70</li><li>71</li><li>72</li><li>73</li><li>74</li><li>75</li><li>76</li><li>77</li><li>78</li><li>79</li><li>80</li><li>81</li><li>82</li><li>83</li><li>84</li><li>85</li><li>86</li><li>87</li><li>88</li><li>89</li><li>90</li><li>91</li><li>92</li><li>93</li><li>94</li><li>95</li><li>96</li><li>97</li><li>98</li><li>99</li><li>100</li><li>101</li><li>102</li><li>103</li><li>104</li><li>105</li><li>106</li><li>107</li><li>108</li><li>109</li><li>110</li><li>111</li><li>112</li><li>113</li><li>114</li><li>115</li><li>116</li><li>117</li><li>118</li><li>119</li><li>120</li><li>121</li><li>122</li><li>123</li><li>124</li><li>125</li><li>126</li><li>127</li><li>128</li><li>129</li><li>130</li><li>131</li><li>132</li><li>133</li><li>134</li><li>135</li><li>136</li><li>137</li><li>138</li><li>139</li><li>140</li><li>141</li><li>142</li><li>143</li><li>144</li><li>145</li><li>146</li><li>147</li><li>148</li><li>149</li><li>150</li><li>151</li><li>152</li><li>153</li><li>154</li><li>155</li><li>156</li><li>157</li><li>158</li><li>159</li><li>160</li><li>161</li><li>162</li><li>163</li><li>164</li><li>165</li><li>166</li><li>167</li><li>168</li><li>169</li><li>170</li><li>171</li><li>172</li><li>173</li><li>174</li><li>175</li><li>176</li><li>177</li><li>178</li><li>179</li><li>180</li><li>181</li><li>182</li><li>183</li><li>184</li><li>185</li><li>186</li><li>187</li><li>188</li><li>189</li><li>190</li><li>191</li><li>192</li><li>193</li><li>194</li><li>195</li><li>196</li><li>197</li><li>198</li><li>199</li><li>200</li><li>201</li><li>202</li><li>203</li><li>204</li><li>205</li><li>206</li><li>207</li><li>208</li><li>209</li><li>210</li><li>211</li><li>212</li><li>213</li><li>214</li><li>215</li><li>216</li><li>217</li><li>218</li><li>219</li><li>220</li><li>221</li><li>222</li><li>223</li><li>224</li><li>225</li><li>226</li><li>227</li><li>228</li><li>229</li><li>230</li><li>231</li><li>232</li><li>233</li><li>234</li><li>235</li><li>236</li><li>237</li><li>238</li><li>239</li><li>240</li><li>241</li><li>242</li><li>243</li><li>244</li><li>245</li><li>246</li><li>247</li><li>248</li><li>249</li><li>250</li><li>251</li><li>252</li><li>253</li><li>254</li><li>255</li><li>256</li><li>257</li><li>258</li><li>259</li><li>260</li><li>261</li><li>262</li><li>263</li><li>264</li><li>265</li><li>266</li><li>267</li><li>268</li><li>269</li><li>270</li><li>271</li><li>272</li><li>273</li><li>274</li><li>275</li><li>276</li><li>277</li><li>278</li><li>279</li><li>280</li><li>281</li><li>282</li><li>283</li><li>284</li><li>285</li><li>286</li><li>287</li><li>288</li><li>289</li><li>290</li><li>291</li><li>292</li><li>293</li><li>294</li><li>295</li><li>296</li><li>297</li><li>298</li><li>299</li><li>300</li><li>301</li><li>302</li><li>303</li><li>304</li><li>305</li><li>306</li><li>307</li><li>308</li><li>309</li><li>310</li><li>311</li><li>312</li><li>313</li><li>314</li><li>315</li><li>316</li><li>317</li><li>318</li><li>319</li><li>320</li><li>321</li><li>322</li><li>323</li><li>324</li><li>325</li><li>326</li><li>327</li><li>328</li><li>329</li><li>330</li><li>331</li><li>332</li><li>333</li><li>334</li><li>335</li><li>336</li><li>337</li><li>338</li><li>339</li><li>340</li><li>341</li><li>342</li><li>343</li><li>344</li><li>345</li><li>346</li><li>347</li><li>348</li><li>349</li><li>350</li><li>351</li><li>352</li><li>353</li><li>354</li><li>355</li><li>356</li><li>357</li><li>358</li><li>359</li><li>360</li><li>361</li><li>362</li><li>363</li><li>364</li><li>365</li><li>366</li><li>367</li><li>368</li><li>369</li><li>370</li><li>371</li><li>372</li><li>373</li><li>374</li><li>375</li><li>376</li><li>377</li><li>378</li><li>379</li><li>380</li><li>381</li><li>382</li><li>383</li><li>384</li><li>385</li><li>386</li><li>387</li><li>388</li><li>389</li><li>390</li><li>391</li><li>392</li><li>393</li><li>394</li><li>395</li><li>396</li><li>397</li><li>398</li><li>399</li><li>400</li><li>401</li><li>402</li><li>403</li><li>404</li><li>405</li><li>406</li><li>407</li><li>408</li><li>409</li><li>410</li><li>411</li><li>412</li><li>413</li><li>414</li><li>415</li><li>416</li><li>417</li><li>418</li><li>419</li><li>420</li><li>421</li><li>422</li><li>423</li><li>424</li><li>425</li><li>426</li><li>427</li><li>428</li><li>429</li><li>430</li><li>431</li><li>432</li><li>433</li><li>434</li><li>435</li><li>436</li><li>437</li><li>438</li><li>439</li><li>440</li><li>441</li><li>442</li><li>443</li><li>444</li><li>445</li><li>446</li><li>447</li><li>448</li><li>449</li><li>450</li><li>451</li><li>452</li><li>453</li><li>454</li><li>455</li><li>456</li><li>457</li><li>458</li><li>459</li><li>460</li><li>461</li><li>462</li><li>463</li><li>464</li><li>465</li><li>466</li><li>467</li><li>468</li><li>469</li><li>470</li><li>471</li><li>472</li><li>473</li><li>474</li><li>475</li><li>476</li><li>477</li><li>478</li><li>479</li><li>480</li><li>481</li><li>482</li><li>483</li><li>484</li><li>485</li><li>486</li><li>487</li><li>488</li><li>489</li><li>490</li><li>491</li><li>492</li><li>493</li><li>494</li><li>495</li><li>496</li><li>497</li><li>498</li><li>499</li><li>500</li><li>501</li><li>502</li><li>503</li><li>504</li><li>505</li><li>506</li><li>507</li><li>508</li><li>509</li><li>510</li><li>511</li><li>512</li><li>513</li><li>514</li><li>515</li><li>516</li><li>517</li><li>518</li><li>519</li><li>520</li><li>521</li><li>522</li><li>523</li><li>524</li><li>525</li><li>526</li><li>527</li><li>528</li><li>529</li></ul>
调试的时候你们可以调用中序遍历来做,我在上一篇博客中提供了PHP实现的二叉树图形化,有了视觉上的帮助就能更好的帮助我们进行调试,详细大家可以访问我的上一篇博客:《利用PHP实现二叉树的图形显示》
0 0