码迷,mamicode.com
首页 > 其他好文 > 详细

二叉树相关

时间:2018-02-22 17:32:06      阅读:141      评论:0      收藏:0      [点我收藏+]

标签:lan   时间复杂度   过程   解决   链表   tree   没有   结构体   指针   

BST:

增:(插入)

    ? 若当前的二叉查找树为空,则插入的元素为根节点,

    ? 若插入的元素值小于根节点值,则将元素插入到左子树中,

    ? 若插入的元素值不小于根节点值,则将元素插入到右子树中,

  ? 递归上述过程,直到找到插入点为叶子节点

 

查:

给定一颗二叉查找树,查找某节点p的过程如下:

? 将当前节点cur赋值为根节点root;

? 若p的值小于当前节点cur的值,查找cur的左子树;

? 若p的值不小于当前节点cur的值,查找cur的右子树;

? 递归上述过程,直到cur的值等于p的值或者cur为空;

? 当然,若节点是结构体,注意定义“小于”“不小于”“等于”的具体函数。

删:

记待删除的节点为p,分三种情况进行处理:

? p为叶子节点

  p为叶子节点,直接删除该节点,再修改p的父节点的指针

? p为单支节点

  若p为单支节点(即只有左子树或右子树),则将p的子树与p的父亲节点相连,删除p即可

? p的左子树和右子树均不空

  若p的左子树和右子树均不空,则找到p的直接后继d(p的右孩子的最左子孙),因为d一定没有左子树,所以使用删除单支节点的方法:

删除d,并让d的父亲节点dp成为d的右子树的父亲节点;同时,用d的值代替p的值;

  对偶的,可以找到p的直接前驱x(p的左孩子的最右子孙),x一定没有右子树,所以可以删除x,并让x的父亲节点成为x的左子树的父亲节点。

  

 二叉树树的遍历 递归or非递归

前序遍历  : http://www.cnblogs.com/zle1992/p/8387902.html

中序遍历 :http://www.cnblogs.com/zle1992/p/8342423.html

后序遍历 :http://www.cnblogs.com/zle1992/p/8458643.html

 

根据前序中序,构造二叉树 http://www.cnblogs.com/zle1992/p/8360249.html

根据中序后序,构造二叉树 http://www.cnblogs.com/zle1992/p/8379513.html

 平衡二叉树 Balanced Binary Tree(AVL树)

这个方案很好的解决了二叉查找树退化成链表的问题,把插入,查找,删除的时间复杂度最好情况和最坏情况都维持在O(logN)。

 

 

二叉树相关

标签:lan   时间复杂度   过程   解决   链表   tree   没有   结构体   指针   

原文地址:https://www.cnblogs.com/zle1992/p/8458420.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!