144. 二叉树的前序遍历

题目描述:给定一个二叉树,返回它的 前序 遍历。

 示例:

输入: [1,null,2,3]  
   1
    \
     2
    /
   3 

输出: [1,2,3]

进阶: 递归算法很简单,你可以通过迭代算法完成吗?

 

大概思路:设 root  为指向二叉树根节点的指针变量

(1)若 root  为空,返回空,否则,根节点 root 入栈;

(2)若栈不为空,获取栈顶结点p,并访问获取的结点;

(3)若 p 的右子树不为空,p的右子树进栈;

(4)若 p 的左子树不为空,p的左子树进栈;

(5)转到(1),直到栈为空为止;

 

 1 /**
 2  * Definition for a binary tree node.
 3  * struct TreeNode {
 4  *     int val;
 5  *     struct TreeNode *left;
 6  *     struct TreeNode *right;
 7  * };
 8  */
 9 /**
10  * Return an array of size *returnSize.
11  * Note: The returned array must be malloced, assume caller calls free().
12  */
13 
14 int* preorderTraversal(struct TreeNode* root, int* returnSize) {
15    
16     if( root == NULL)   //若根为空,
17         return;
18     
19     int * result = (int *)malloc(sizeof(int) * 100);  //定义数组,存放遍历结果;
20     
21     struct TreeNode * stack[1000];
22     int top = -1;                    //定义一个顺序栈
23     int i = 0;
24     
25     struct TreeNode * p;
26     
27     stack[++top] = root;  //根节点首先进栈
28 
29     while( top != -1 )
30     {
31         p = stack[top--];
32         result[i++] = p->val;  //获取栈顶节点,并对其进行处理
33 
34         if( p->right != NULL)  //右子树是否为空
35         {
36             stack[++top] = p->right;
37         }
38 
39         if( p->left != NULL )  //左子树是否为空
40         {
41             stack[++top] = p->left;
42         } 
43     }
44 
45     *returnSize = i;
46     return result;
47     
48 }

 

 

PS:树的先序递归算法,与本题无关;

1 void preorder( BiTree root)
2 {
3       if( !root )
4          return;
5      
6       printf( "%c ",BT->data);     //访问根节点
7       preorder(BT->left);          //递归左子树
8       preorder(BT->right);        //递归右子树
9 }

 

posted @ 2018-11-14 16:10  daid  阅读(143)  评论(0)    收藏  举报