C语言每日一题(49)二叉树的三种基本遍历方法

2024-01-31 10:28:47 浏览数 (2)

知识点:链式二叉树、递归

思路分析

顺便说一下三种遍历的方法

前序遍历:根、左子树、右子树

中序遍历:左子树、根、右子树

后序遍历:左子树、右子树、根

以这棵树为例

以前序遍历为例,根据递归的思想,先打印根节点数据再将自己的左孩子结点和右孩子结点分别为参数调用自己,依次递归到叶子结点,即所传入参数为空时返回。

其实递归就是在自己体内调用自己,相当于有一个人给大家讲故事,故事内容是:一个人在给大家讲故事。即在故事中提到同样的故事,这就是递归。

把思想实现在题中

代码语言:javascript复制
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
/**
 * Note: The returned array must be malloced, assume caller calls free().
 */

int BinaryTreeSize(struct TreeNode* root)
{
	if (root == NULL)
	{
		return 0;
	}
	return BinaryTreeSize(root->left)   BinaryTreeSize(root->right)   1;//求二叉树结点个数
}
void PrevOrder(struct TreeNode* root,int* a,int* pi)
{
	if (root == NULL)
	{
		return;
	}
    a[(*pi)  ]=root->val;
	PrevOrder(root->left,a,pi);
	PrevOrder(root->right,a,pi);
}
int* preorderTraversal(struct TreeNode* root, int* returnSize) {
    int n=BinaryTreeSize(root);
    *returnSize=n;
    int* a=(int*)malloc(sizeof(int)*n);//动态申请一个数组,题目要求返回一个数组
    int i=0;
    PrevOrder(root,a,&i);
    return a;
   
}

对于本题知识点的个人理解

其实,对于简单的递归,可以简单的概括,就是自己调用自己,但后面尝试用递归来做删除链表元素这道题,说实话1,每有任何思路,如果只是根据题解的代码跑一遍,肯定能成功,有一说一这和背代码没区别,递归难就难在如何去递归这个思路出来才是递归的关键

0 人点赞