博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
前序、中序、后序递归、非递归方式打印二叉树
阅读量:2243 次
发布时间:2019-05-09

本文共 1872 字,大约阅读时间需要 6 分钟。

文章目录

递归

前序

void PreOrder(BNode *root)	{
if (root == NULL) {
return; } printf("%d ", root->data); //先打印根节点 PreOrder(root->left); //打印左子树 PreOrder(root->right);//打印右子树 }

中序

void InOrder(BNode *root)	{
if (root == NULL) {
return; } PreOrder(root->left); //先打印左子树 printf("%d ", root->data);//打印根节点 PreOrder(root->right);//打印右子树 }

后序

void PostOrder(BNode *root)	{
if (root == NULL) {
return; } PreOrder(root->left); //先打印左子树 PreOrder(root->right);//打印右子树 printf("%d ", root->data);//打印根节点 }

非递归

前序

如果不用递归的话,我们能想到的一定会用到循环,那么如何来保存这些结点?可以用栈,因为用循环,肯定要从根节点开始,当循环到某一个结点时,我们只会对该结点及其子树进行操作,就利用到了栈的特性。

在压栈的时候,一直都是先压左子树,因为在遍历中,左孩子一定在右孩子的前面
对于前序遍历,先打印根节点,因为压栈就是从根节点开始的,一直压左孩子,当左孩子为空时,就让栈顶元素出栈,并开始压右孩子

void PreOrder(BNode *root)	{
Stack stack; StackInit(&stack); BNode *node = root; BNode *top; while (node != NULL || !StackEmpty(&stack)) {
while (node != NULL) {
printf("%d ", node->data); StackPush(&stack, node); node = node->left; } top = StackTop(&stack); StackPop(&stack); node = top->right; } }

中序

void InOrder(BNode *root)	{
Stack stack; StackInit(&stack); BNode *node = root; BNode *top; while (node != NULL || !StackEmpty(&stack)) {
while (node != NULL) {
StackPush(&stack, node); node = node->left; } top = StackTop(&stack); printf("%d ", top->data); StackPop(&stack); node = top->right; } }

后序

void PostOrder(BNode *root)	{
Stack stack; StackInit(&stack); BNode *node = root; BNode *top; BNode *last = NULL; while (node != NULL || !StackEmpty(&stack)) {
while (node != NULL) {
StackPush(&stack, node); node = node->left; } top = StackTop(&stack); if (top->right == NULL || top->right == last) {
printf("%d ", top->data); last = top; StackPop(&stack); } else {
node = top->right; } } }

转载地址:http://ndwdb.baihongyu.com/

你可能感兴趣的文章
AJAX 设计制作 在公司弄的 非得要做出这个养的 真晕!
查看>>
Linux 查看文件大小
查看>>
Java并发编程:线程池的使用
查看>>
redis单机及其集群的搭建
查看>>
Java多线程学习
查看>>
检查Linux服务器性能
查看>>
Java 8新的时间日期库
查看>>
Chrome开发者工具
查看>>
【LEETCODE】102-Binary Tree Level Order Traversal
查看>>
【LEETCODE】106-Construct Binary Tree from Inorder and Postorder Traversal
查看>>
【LEETCODE】202-Happy Number
查看>>
和机器学习和计算机视觉相关的数学
查看>>
十个值得一试的开源深度学习框架
查看>>
【LEETCODE】240-Search a 2D Matrix II
查看>>
【LEETCODE】53-Maximum Subarray
查看>>
【LEETCODE】215-Kth Largest Element in an Array
查看>>
【LEETCODE】241-Different Ways to Add Parentheses
查看>>
【LEETCODE】312-Burst Balloons
查看>>
【LEETCODE】232-Implement Queue using Stacks
查看>>
【LEETCODE】225-Implement Stack using Queues
查看>>