(leetcode)二叉树的前序遍历-c语言实现

Posted xingmuxin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了(leetcode)二叉树的前序遍历-c语言实现相关的知识,希望对你有一定的参考价值。

给定一个二叉树,返回它的 前序 遍历。

 示例:

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

输出: [1,2,3]

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

前序遍历


前序遍历首先访问根节点,然后遍历左子树,最后遍历右子树。

用c语言来实现比较麻烦,现在大概介绍下我的思路,首先题目先要实现一个前序遍历,如果用递归,会比较简单,几行代码就可以实现,但是现在要求使用迭代发来实现。整个遍历过程是,访问根节点,然后遍历其左子树,然后再看左子树是否有其左孩子和右孩子。因为在查看左孩子之后,还要再查看根节点的右孩子,所以每次需要把根节点记录下来,需要存在栈中。所以我们需要实现一个栈,有压栈和出栈操作。另外我们需要一个链表来存放已经访问过的节点,到最后,需要把这些节点统一存储到一个数组中,然后返回。

下面来看下我码的代码

/* 链表节点 用于存储输出结果 */
struct listNode 
    int val;
    struct listNode *next;
;

struct list 
    int count;
    struct listNode *head;
    struct listNode *tail;
;

/* 栈节点,用于存储已经遍历过的根节点 */
struct StackNode

    void *entry;
    struct StackNode *next;
;

struct stack 
    struct StackNode *top;
;

void init_stack(struct stack *s)

    s->top = NULL;


void stack_push(struct stack *s, void *np)

    struct StackNode *node = malloc(sizeof(struct StackNode));
    node->entry = np;
    node->next = s->top;
    s->top = node;
;

void *stack_pop(struct stack *s)

    struct StackNode *np = s->top;
    void *node = np->entry;
    s->top = np->next;
    free(np);
    return node;
;

bool isEmpty(struct stack *s)

    return (s->top == NULL) ? true : false;


void init_list(struct list *l)

    l->count = 0;
    l->head = NULL;
    l->tail = NULL;


void add_new_node(struct list *l, struct listNode *node)

    if (!l->head)
    
        l->head = node;
        l->tail = node;
        l->count = 1;
        return;
    
    
    l->tail->next = node;
    l->tail = node;
    l->count++;

这些是辅助函数

int* preorderTraversal(struct TreeNode* root, int* returnSize)
    struct TreeNode *pNode = root;
    struct listNode *newNode = NULL;
    struct list *l = malloc(sizeof(struct list));
    struct stack *s = malloc(sizeof(struct stack));
    int *r = NULL;
    int i = 0;
    struct listNode *head = NULL;
    init_list(l);
    init_stack(s);
    
    while (pNode != NULL || !isEmpty(s))
    
        if (pNode != NULL)
        
            newNode = malloc(sizeof(struct listNode));
            newNode->val = pNode->val;
            newNode->next = NULL;
            add_new_node(l, newNode);
            stack_push(s, (void *)pNode);
            pNode = pNode->left;
        
        else
        
            pNode = (struct TreeNode *)stack_pop(s);
            pNode = pNode->right;            
                
    
    
    r = malloc(sizeof(int) * l->count);
    head = l->head;
    while(head && i < l->count)
    
        r[i] = head->val;
        i++;
        head = head->next;
    
    *returnSize = l->count;
    
    return r;    

这个是具体的前序遍历函数。

以上是关于(leetcode)二叉树的前序遍历-c语言实现的主要内容,如果未能解决你的问题,请参考以下文章

⭐算法入门⭐《二叉树》简单09 —— LeetCode 144. 二叉树的前序遍历

根据二叉树的前序遍历和中序遍历构建二叉树的c语言完整代码

精选力扣500题 第55题 LeetCode 144. 二叉树的前序遍历c++/java详细题解

LeetCode第144题—二叉树的前序遍历—Python实现

LeetCode-144. 二叉树的前序遍历(java)

C语言根据层次遍历和中序遍历求二叉树的前序遍历和后序遍历。下面有我的建树函数,有注释的。