题目:
给你二叉树的根节点 root ,返回它节点值的 前序 遍历。
解题思路:
方法1: dfs
方法2:迭代
从根节点开始,每次迭代弹出当前栈顶元素,并将其孩子节点压入栈中,先压右孩子再压左孩子。
- 先压右儿子: 因为先弹出左儿子;
- 需要新建数组,保存迭代的节点;
- 注意处理首节点即根节点,
//方法1:dfs
int getNodeNum(struct TreeNode *root)
{
if (!root) {
return 0;
}
return getNodeNum(root->left) + getNodeNum(root->right) + 1;
}
void dfs(struct TreeNode *root, int* res, int *returnSize)
{
// 终止条件
if (!root) {
return;
}
// 先序遍历
res[(*returnSize)++] = root -> val;
dfs (root -> left, res, returnSize);
dfs (root -> right, res, returnSize);
return;
}
int *preorderTraversal(struct TreeNode *root, int *returnSize)
{
//
int nodeNum = getNodeNum(root);
int *res = calloc(nodeNum, sizeof(int));
*returnSize = 0;
if (!root) {
return res;
}
dfs(root, res, returnSize);
return res;
}
//方法2:迭代
int TreeSize(struct TreeNode *root)
{
if (!root) {
return 0;
}
return TreeSize(root->left) + TreeSize(root->right) + 1;
}
int *preorderTraversal(struct TreeNode *root, int *returnSize)
{
int nodeNum = TreeSize(root);
struct TreeNode* stack[nodeNum];
memset (stack, 0, sizeof (stack));
//struct TreeNode *stack[500]; // 局部变量数组 需要申请定值才能进行直接初始化
int *res = calloc(nodeNum, sizeof(int));
*returnSize = 0;
int top = -1;
if (!root) {
return res;
}
stack[++top] = root;
while (top != -1) { // 关注点1 表示栈中有元素
root = stack[top--];//这个位置处理之后 top == -1
res[(*returnSize)++] = root->val;
// 关注点2:先入右子树,再入左子树
if (root->right) {
stack[++top] = root->right;
}
if (root->left) {
stack[++top] = root->left;
}
}
return res;
}