二叉树中序遍历(非递归非栈法 C语言版)

#ifndef HELLOCPLUS_TREE_TEST_H
#define HELLOCPLUS_TREE_TEST_H

struct TreeNode {
    int value;
    TreeNode *leftChild;
    TreeNode *rightChild;
    TreeNode(int x) : value(x), leftChild(NULL), rightChild(NULL) {}
};

TreeNode *getTree(int length);

void *inorderTraversal(TreeNode *root);

#endif //HELLOCPLUS_TREE_TEST_H
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include "tree_test.h"

TreeNode *addNode(TreeNode *head, int value) {
    if (head == NULL) {
        head = (TreeNode *) malloc(sizeof(TreeNode));
        head->value = value;
        head->leftChild = NULL;
        head->rightChild = NULL;
    } else if (value >= head->value) {
        head->rightChild = addNode(head->rightChild, value);
    } else {
        head->leftChild = addNode(head->leftChild, value);
    }
}

TreeNode *getTree(int length) {
    srand((unsigned) time(NULL));
    TreeNode *head = NULL;
    TreeNode *p = NULL;
    for (int i = 0; i < length; i++) {
        if (head == NULL) {
            head = addNode(head, rand());
            p = head;
        } else {
            p = addNode(p, rand());
        }
    }
    return head;
}

void *inorderTraversal(TreeNode *root) {
    TreeNode *cur = root;
    TreeNode *prev = NULL;
    TreeNode *head = NULL;

    while (cur != NULL) {
        if (cur->leftChild == NULL) {
            printf("%d ", cur->value);
            cur = cur->rightChild;
        } else {
            // find predecessor
            prev = cur->leftChild;
            while (prev->rightChild != NULL
                   && prev->rightChild != cur) {
                prev = prev->rightChild;
            }

            if (prev->rightChild == NULL) {
                prev->rightChild = cur;
                cur = cur->leftChild;
            } else {
                prev->rightChild = NULL;
                printf("%d ", cur->value);
                cur = cur->rightChild;
            }
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值