二叉树的前序遍历
思路:
- 求出树的个数,开辟数组空间
- 利用递归把值传给数组
- 返回数组
/**
* 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 Treesize(struct TreeNode* root)
{
if(root == NULL)
{
return 0;
}
return 1 + Treesize(root->left) + Treesize(root->right);
}
//递归把值传给数组array
//注意:这里下标i要传指针,递归才能改变值
void _preorderTraversal(struct TreeNode* root, int* array, int* pi)
{
if(root == NULL)
{
return;
}
array[(*pi)++] = root->val;
_preorderTraversal(root->left, array, pi);
_preorderTraversal(root->right, array, pi);
}
int* preorderTraversal(struct TreeNode* root, int* returnSize) {
int size = Treesize(root);
//开辟空间
int* arr = (int*)malloc(sizeof(int)*size);
int i = 0;
_preorderTraversal(root, arr, &i);
*returnSize = size;
return arr;
}
附:用C语言简单实现
- 前序
- 中序
- 后序
- 树的深度
- 树的叶子数
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
typedef char BTDateType;
/* A
B C
D E*/
typedef struct BinaryTreeNode
{
BTDateType val;
struct BinaryTreeNode* _left;
struct BinaryTreeNode* _right;
}BTNode;
BTNode* creatNode(BTDateType x)
{
BTNode* node = (BTNode*)malloc(sizeof(BTNode));
node->val = x;
node->_left = NULL;
node->_right = NULL;
return node;
}
//前序
void PrevOrder(BTNode* node)
{
if (!node)
{
printf("NULL ");
return;
}
printf("%c ", node->val);
PrevOrder(node->_left);
PrevOrder(node->_right);
}
//中序
void middleOrder(BTNode* node)
{
if (!node)
{
printf("NULL ");
return;
}
middleOrder(node->_left);
printf("%c ", node->val);
middleOrder(node->_right);
}
//后序
void lateOrder(BTNode* node)
{
if (!node)
{
printf("NULL ");
return;
}
lateOrder(node->_left);
lateOrder(node->_right);
printf("%c ", node->val);
}
int TreeSize(BTNode* node)
{
if (node == NULL)
{
return 0;
}
return 1 + TreeSize(node->_left) + TreeSize(node->_right);
}
//叶子数
int TreeLeafSize(BTNode* node)
{
if (node == NULL)
return 0;
if (node->_left == NULL && node->_right == NULL)
return 1;
else
return TreeLeafSize(node->_left) + TreeLeafSize(node->_right);
}
//树深度
int TreeDepth(BTNode* node)
{
if (node == NULL)
{
return 0;
}
int leftDepth = TreeDepth(node->_left);
int rightDepth = TreeDepth(node->_right);
//后序
//递归取左右子树深度最深一颗并加1
return (leftDepth > rightDepth) ? leftDepth + 1 : rightDepth + 1;
}
int main()
{
BTNode* A = creatNode('A');
BTNode* B = creatNode('B');
BTNode* C = creatNode('C');
BTNode* D = creatNode('D');
BTNode* E = creatNode('E');
A->_left = B;
A->_right = C;
B->_left = D;
B->_right = E;
printf("前序: ");
PrevOrder(A);
printf("\n");
printf("中序: ");
middleOrder(A);
printf("\n");
printf("后序: ");
lateOrder(A);
printf("\n");
getchar();
int size = TreeSize(A);
printf("%d \n", size);
size = TreeSize(B);
printf("%d \n", size);
size = TreeLeafSize(A);
printf("A叶节点个数: %d\n", size);
size = TreeLeafSize(B);
printf("B叶节点个数: %d\n", size);
size = TreeLeafSize(C);
printf("C叶节点个数: %d\n", size);
size = TreeLeafSize(A);
printf("A结点二叉树深度为:%d\n", size);
size = TreeLeafSize(B);
printf("B结点二叉树深度为:%d\n", size);
size = TreeLeafSize(D);
printf("D结点二叉树深度为:%d\n", size);
return 0;
}