二叉树后序遍历
后序遍历
顺序为:左子树->右子树->跟节点
先遍历左子树,然后遍历右子树,最后遍历跟节点,以此轮推,直到遍历所有节点
如上后序遍历的结果为:1 3 2 5 4 7 9 8 6
后序遍历的逻辑如下:
后序遍历
1:每个节点的值只获取一次
2:如果有左子树,执行1 之前要先获取左子树所有节点的值,否则执行3
3:如果有右子树,执行 2 之后要获取右子树所有节点的值
4:所有节点值的获取,要遵守 1、2、3 条
后序遍历的两种方式:递归实现、迭代实现
递归实现如下
public IList<int> PostorderTraversal(TreeNode root)
{
// 集合存储访问到的节点值
List<int> list = new List<int>();
// 调用递归函数
PostorderTraversal(root, list);
return list;
}
// 递归实现
public void PostorderTraversal(TreeNode root, List<int> list)
{
if (null == root)
{
return;
}
// 递归调用左子树
PostorderTraversal(root.left, list);
// 递归调用右子树
PostorderTraversal(root.right, list);
// 将节点的值存储到集合中
list.Add(root.val);
}
迭代实现如下
// 迭代实现
public Stack<int> PostorderTraversal3(TreeNode root)
{
// 下面使用两个栈Stack结构
// stack 存放遍历过程中的节点
// resultStack 存放最终阶段顺序
// 1:将跟节点放入 stack
// 2:节点从 stack 取出,放入 resultStack
// 3:节点有左字树,将左子节点 放入 stack
// 4:节点有右子树,将右子节点 放入 stack
// 最终放入 resultStack 的节点顺序就是:跟节点、右子树、左子树
// 然后顺次从 resultStack 将节点取出得到的顺序就是: 左子树、右子树、根节点
Stack<int> resultStack = new Stack<int>();
if (null == root)
{
return resultStack;
}
Stack<TreeNode> stack = new Stack<TreeNode>();
// 将跟节点入栈
stack.Push(root);
while (stack.Count > 0)
{
// 节点出栈
TreeNode node = stack.Pop();
// 将 stack 出栈的节点值存入 resultStack
resultStack.Push(node.val);
// 如果左子树不为空,则将左子树入栈stack
if (null != node.left)
{
stack.Push(node.left);
}
// 如果右子树不为空,则将右子树入栈stack
if (null != node.right)
{
stack.Push(node.right);
}
}
return resultStack;
}
至此二叉树后续遍历原理以及实现均已奉上