玩转数据结构从入门到进阶(三 链表、二叉树与递归)

链表与递归:

项目源码:https://gitee.com/renqiqi/shujvjiegou

递归:将原来的问题转化为更小的同一问题。
链表具有天然的递归性质,可以看做链表头挂着一个更短的链表,,,
解决递归问题时,应当注意函数的语义,才能更加容易的转换为更加简单一部的问题。比如删除链表中元素

removeElement(ListNode head,int val)这个函数就是删除以head为头结点的链表中所有值为val的元素。所以他的

进一步简单问题就是removeElement(head.next,val);删除以head.next为头结点的链表中值为val的元素。
双链表:每个node中有两个指向。
循环链表:设置一个dummyhead,连接首尾。
二叉树:
动态数据结构。具有唯一根节点。每个节点有左和右两个节点,称为左孩子和右孩子。一个孩子都没有的节点成为叶

子节点。每个节点只能有一个父亲节点。每个二叉树只有一个节点没有父节点,就是根节点。
二叉树同样具有天然的递归结构:每个节点的左、右子树也是二叉树。
二分搜索树:
是一种二叉树。每个节点的值大于左子树所有节点的值,小于其右子树所有节点的值。存储的元素具有可比较性。我

们的二分搜索树不包含重复元素。如果想包含重复元素,只需要改变定义,比如左子树小于等于节点。
这个前中后序是按照访问根节点的顺序,先访问就是前,中间就是中,后访问就是后。所有的遍历都是递归实现的。
二叉树的前序遍历:先访问该节点,在访问左右子树。遍历结果从根节点开始,遍历完左子树,再遍历右子树。
中序遍历:先访问左子树,再访问该节点,再访问右子树。按照顺序输出。排序后的结果。
怎么看出前中后序遍历:对于每个节点来说都有三次访问机会,前中后就是看在哪个访问机会中将他打印出来。左中

右三个点,遍历的顺序就是从根节点开始,递归遍历它的左子树和右子树,左子树遍历完成才遍历右子树。

项目源码:https://gitee.com/renqiqi/shujvjiegou

猜你喜欢

转载自blog.csdn.net/sinat_36748650/article/details/86516502