自学内容网 自学内容网

数据结构-二叉树-链式

一、链式二叉树的结构

typedef int BTNodeDataType;
typedef struct BTNode
{
BTNodeDataType data;
struct BTNode* left;
struct BTNode* right;
}BTNode;

二叉树的前中后序遍历

前序:根左右

中序:左根右

后序:左右根

void PreOrder(BTNode* root)
{
if (root == NULL)
{
return;
}
printf("%d", root->data);
PreOrder(root->left);
PreOrder(root->right);
}

void InOrder(BTNode* root)
{
if (root == NULL)
{
return;
}

InOrder(root->left);
printf("%d", root->data);
InOrder(root->right);
}

void PostOrder(BTNode* root)
{
if (root == NULL)
{
return;
}
PostOrder(root->left);
PostOrder(root->right);
printf("%d", root->data);
}

递归展开图

前序遍历

左右子树的递归使用同一块栈帧。因为在调用右子树的递归之前,左子树的栈帧就已经还给操作系统了。

中序遍历

二、分治

首先我们可以使用分治的思想来思考一个问题,二叉树的节点个数怎么求。我们可以这样思考,先求出左右子树的节点个数,然后返回左右子树节点的数量+根的数量。其实这就是一个分治的思想。

int TreeSize(BTNode* root)
{
if (root == NULL)
{
return 0;
}
int leftsize = TreeSize(root->left);
int rightsize = TreeSize(root->right);
return leftsize + rightsize + 1;
}

我们可以再来举一个例子来思考这个问题,学校的管理制度

比如校长要统计人数,我们就可以把任务分发给院长,然后院长在找到系主任,系主任找到班长,班长找舍长,最后由舍长上报人数。班长开始上报给系主任,系主任报给院长,院长报给校长。这就是分治的思想。

求树的高度,也可以应用分治的思想。

int TreeHeight(BTNode* root)
{
if (root == NULL)
{
return 0;
}
int left = TreeHeight(root->left);
int right = TreeHeight(root->right);

return left > right ? left + 1 : right + 1;
}

不可以这样写,这个写法相当于上面的班长,系主任,院长,校长都是只有七秒记忆的人,导致舍长要报好多遍。

会造成栈溢出的结果。

求第K层的节点个数

根的第k层 = 左子树的第k-1层个数 + 右子树的第k-1层个数。

int TreeKLevel(BTNode* root, int k)
{
if (root == NULL)
{
return 0;
}
if (k == 1)
{
return 1;
}
int left = TreeKLevel(root->left, k - 1);
int right = TreeKLevel(root->right, k - 1);
return left + right;
}

原文地址:https://blog.csdn.net/m0_67635008/article/details/138153344

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!