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 }

浙公网安备 33010602011771号