思考如何将非线性的数据,以线性的方式存储
普通树的存储
双亲表示法:
求父节点比较方便
前面是元素在数组的索引,后面储存的是父节点的索引,数组保存不一定按照A,B…F,G储存,可以随意。但是要记录父节点的索引,这样可以根据数组结构画出树的结构。
孩子表示法:
求子节点比较方便
后面储存子节点的指针
双亲孩子表示法:
二叉树表示法:
把一个普通树转化为二叉树来存储
方法:设法保证任意一个节点左指针指向它的第一个孩子,右指针指向它的下一个兄弟。
这样转化一定没有右子树
森林的存储:
转化后:
任何一个普通树转化为二叉树,都没有右子树。利用这个特点可以让其他树作为其右子树。
先序遍历
中序遍历
后序遍历
所有的都可以总结为以上四种情况。
已知两种遍历序列,求原始二叉树
已知先序和中序求后序
示例1:
先序:ABCDEFGH
中序:BDCEAFHG
求后序:DECBHGFA
示例2:
先序:ABDGHCEFI
中序:GDHBAECIF
求后序:GHDBEIFCA
示例3:
先序:ABFDCLMN
中序:BFACDLNM
求后序:FBCNMLDA
示例4:
先序:MFLAQGBE
中序:FALGQMEB
求后序:AGQLFEBM
已知中序和后序求先序
中序:BDCEAFHG
后序:DECBHGFA
求先序:ABCDEFGH
思路:可以根据先序或后序找出根节点,然后根据中序将其分为左子树和右子树。依次循环往复