1.分别用递归和非递归方式实现二叉树先序、中序和后序遍历
思路:
先序遍历顺序为根、左、右;
中序遍历顺序为左、根、右;
后序遍历顺序为左、右、根。
先序:(其他就是void函数里面的遍历顺序调换)
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
void preorder(struct TreeNode*root,int *res,int *reSize){
if(root==NULL){
return ;
}
res[(*reSize)++]=root->val;
preorder(root->left,res,reSize);
preorder(root->right,res,reSize);
}
int* preorderTraversal(struct TreeNode* root, int* returnSize){
int *res=malloc(sizeof(int)*3000);
*returnSize=0;
preorder(root,res,returnSize);
return res;
}
2。如何较为直观地打印二叉树
题目:
从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。
例如:
给定二叉树: [3,9,20,null,null,15,7],
3
/
9 20
/
15 7
返回:
[3,9,20,15,7]
思路:
二叉树的一个层序遍历,但是要将遍历的结果放在一个malloc申请的数组中
代码
/**
* 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* levelOrder(struct TreeNode* root, int* returnSize){
//初始化
int i=0;//用来记队列的大小
int front=-1;//用来表示队列的位置
int rear=-1;
struct TreeNode *Queue[1100];//创建队列大小
struct TreeNode*p;//建立工作指针
int* arr=(int*)malloc(sizeof(int)*1150);
if(root==NULL){//当二叉树为空
(*returnSize)=0;
return 0;
}else{//当二叉树不为空
Queue[++rear]=root;//根节点先入队列
while(front<rear){
//数据出队列加入数组
p=Queue[++front];
arr[i++]=p->val;
if(p->left){
Queue[++rear]=p->left;
}
if(p->right){
Queue[++rear]=p->right;
}
}
}
*returnSize=i;
return arr;
}