赞
踩
目录
- typedef int BTDataType;
- typedef struct BinaryTreeNode
- {
- struct BinaryTreeNode* left;
- struct BinaryTreeNode* right;
- BTDataType data;
- }BTNode;
- void PrevOrder(BTNode* root)
- {
- if (root == NULL)
- {
- printf("NULL");
- return;
- }
- printf("%c", root->data);
- PrevOrder(root->left);
- PrevOrder(root->right);
- }
- void InOrder(BTNode* root)
- {
- if (root == NULL)
- {
- printf("NULL");
- return;
- }
- InOrder(root->left);
- printf("%c", root->data);
- InOrder(root->right);
- }
- void PostOrder(BTNode* root)
- {
- if (root == NULL)
- {
- printf("NULL");
- return;
- }
- PostOrder(root->left);
- PostOrder(root->right);
- printf("%c", root->data);
- }
- 1、全局
- int size = 0;//这里不妨思考下能不能直接放入BinaryTreeSize函数内部进行定义
- int BinaryTreeSize(BTNode* root)
- {
-
- if (root == NULL)
- {
- return;
- }
- else
- {
- ++size;
- }
-
- BinaryTreeSize(root->left);
- BinaryTreeSize(root->right);
- }
用递归的思想分治,计算二叉树的结点数量,可以认为
数量 = 1 + 左子树数量 + 右子树数量
,其中1是当前根结点数量
- int TreeSize(BTNode* root)
- {
- return root == NULL ? 0 : TreeSize(root->left) + TreeSize(root->right) + 1;//此处的1是自身结点
-
- }
- 2、遍历 -- 局部变量
- void BinaryTreeSize(BTNode* root, int* psize)
- {
- if (root == NULL)
- return;
- else
- ++(*psize);
-
- BinaryTreeSize(root->left, psize);
- BinaryTreeSize(root->right, psize);
- }
按照递归思想,计算二叉树的叶子结点数量,我们可以认为
数量等于 = 0 + 左子树叶子结点数量 + 右子树叶子结点数量
,0是因为当前根结点有子树,说明根结点不是叶子结点.
- //求叶子结点的个数->运用分治的思想
- int TreeLeafSize(BTNode* root)
- {
- //1 空 reutrn0
- //2叶子 return 1
- //非空且不是叶子 return左子树的叶子结点个数+右子树的叶子结点个数
- if (root == NULL)
- {
- return 0;
- }
- if (root->left == NULL && root->right == NULL)
- {
- return 1;
- }
-
- return TreeLeafSize(root->left) + TreeLeafSize(root->right);
-
- }
核心思路:求当前树的第k层=左子树的第k-1层+右子树的第k-1层
- //给的K是几就给出第K层
- //思路:求第K层即为求左子树的第K-1层和右子树的第K-1层
- int TreeKLeveLSize(BTNode* root, int k)
- {
- if (root == NULL)
- {
- return 0;
- }
- if (k == 1)
- return 1;
- return TreeKLeveLSize(root->left, k - 1) + TreeKLeveLSize(root->right, k - 1);
- }
二叉树的高度等于1 + 左右子树高度的最大值.
- //二叉树的深度/高度
- int BinaryTreeDepth(BTNode* root)
- {
- if (root == NULL)
- {
- return 0;
- }
-
- int leftDepth = BinaryTreeDepth(root->left);
- int rightDepth = BinaryTreeDepth(root->right);
-
- return leftDepth > rightDepth ? leftDepth + 1 : rightDepth + 1;
- }
- /*1.root == NULL
- 2.root结点不是要找的,先到左树去找,左树没有再到右树去找
- 3.左右都没有,当前树没有找到返回NULL*/
- BTNode* TreeFind(BTNode* root, BTDataType x)
- {
- if (root == NULL)
- {
- return NULL;
- }
- if(root->data == x)
- {
- return root;
- }
- BTNode*lret = TreeFind(root->left, x);
- if (lret)
- {
- return lret;
- }
- BTNode* rret = TreeFind(root->right, x);
- if (rret)
- {
- return rret;
- }
- //左边右边都没有找到
- return NULL;
- }
二叉树的销毁->采用后续销毁
前中后都是递归返回顺序,处理根的顺序不一样
如果使用一级指针,存在野指针问题,调用BinaryTreeDestory的人,把指针置空
使用一级指针以保持接口的一致性
-
- void BinaryTreeDestory(BTNode* root)
- {
- if (root == NULL)
- {
- return;
- }
- BinaryTreeDestory(root->left);
- BinaryTreeDestory(root->right);
- free(root);
- root = NULL;
- }
- void TreeLevelOrder(BTNode* root)
- {
- Queue q;
- QueueInit(&q);
- if (root)
- {
- QueuePush(&q, root);
- }
-
- while (!QueueEmpty(&q))
- {
- BTNode* front = QueueFront(&q);
- QueuePop(&q);
-
- printf("%c", front->data);
- if (front->left)
- {
- QueuePush(&q, front->left);
- }
- if (front->right)
- {
- QueuePush(&q, front->right);
- }
-
-
- }
- QueueDestory();
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。