一、须要定义二叉树类数组
public class TreeNode { int val; TreeNode left;//左节点 TreeNode right;//右节点 TreeNode(int x) { val = x; } }
二、二叉树的遍历方式
简单来讲
前序遍历:根左右:A, B, D, E, C, F, G
中序遍历:左根右:D, B, E, A, F, C, G
后序遍历:左右根:D, E, B, F, G, C, A
层序遍历:按层从左到右访问:优化
[ [A], [B,C], [D,E,F,G] ]
二叉树的遍历(前序遍历、中序遍历、后序遍历、层序遍历)
“遇到二叉树,基本是 递归 ”
首先前序获得根,就能从中序中分出左子树和右子树。分出的左子树,再从前序获得它的根,就能从中序中分出它的左子树和右子树,分出的右子树,再从前序获得它的根,就能从中序中分出它的左子树和右子树....spa
总结下来就是,前序获得根,中序分左右子树。
再明确一下左右子的在 中序的范围,用left right来表示;
以及根在 前序的位置 root,和根在 中序的位置 i。
假设一个二叉树,.net
已知此序的root,left,right,inorder_root,length=(0,0,8,5,9)
前序:987216543
中序:271869453code
用前序的根[9]分:
前序:[9],87216543
中序:[27186],[9],[453]
分得前序:[9],[87216],[543]
获得
左子树1:前序:87216
左子树1:中序:27186blog
该序的root,left,right,inorder_root=(1,0,4,3)(root+1,left,i-1,i)
右子树1:前序:543
右子树1:中序:453递归
该序的root,left,right,inorder_root=(6,6,8,7) (root+(i-left)+1,i+1,right,i)
后面以此类推索引
以此类推右子树。
但一直都以最开始的序列为参考写索引位置。ci