以下是我自己的一些写法,由于本人修行尚浅,因此代码难免有不当之处,如有发现,敬请指出,如有雷同纯属巧合。
/* 先序遍历 * 思路: 先输出根 并一直寻找左子树,同时,若存在右子树,则右子树入栈。 * 找完所有的左子树之后,栈顶出栈,重复上述工作,一直到栈空为止。 * */ void PreOrderTraverse(PBiTree T) { if (T == NULL) { return; } Stack nStack = {0,}; while (NULL != T) { if (T->RChild != NULL) { nStack.BElem[nStack.top++] = T->RChild; } printf("%c ",T->elem); T = T->LChild; if (NULL == T && nStack.top != 0) { T = nStack.BElem[-- nStack.top]; } } }
/** 中序遍历 * 根 先入栈, * */ void InOrderTraverse(PBiTree T) { if (T == NULL) { return; } Stack nStack = {0,}; while (NULL != T) { while (NULL != T->LChild) { nStack.BElem[nStack.top++] = T; T = T->LChild; } printf("%c ",T->elem); T = T->RChild; while (NULL == T) { if (0 != nStack.top) { T = nStack.BElem[--nStack.top]; printf("%c ",T->elem); } else { break; } T = T->RChild; } } }
整个的代码:
#include <stdio.h> #include <stdlib.h> #define MAX_SIZE 100 typedef struct BiTree { char elem; struct BiTree * LChild; struct BiTree * RChild; } BiTree,*PBiTree; typedef struct Stack { int top; PBiTree BElem[MAX_SIZE]; } Stack; PBiTree CreateBiTree(); void PreOrderTraverse(PBiTree T); void InOrderTraverse(PBiTree T); int main() { PBiTree Tree = CreateBiTree(); printf("\n先序遍历:\n"); PreOrderTraverse(Tree); printf("\n中序遍历:\n"); InOrderTraverse(Tree); return 0; } PBiTree CreateBiTree() { char data; PBiTree T; scanf("%c",&data); if (data == '#') { T = NULL; } else { T = (PBiTree)malloc(sizeof(BiTree)); T->elem = data; T->LChild = CreateBiTree(); T->RChild = CreateBiTree(); } return T; } /* 先序遍历 * 思路: 先输出根 并一直寻找左子树,同时,若存在右子树,则右子树入栈。 * 找完所有的左子树之后,栈顶出栈,重复上述工作,一直到栈空为止。 * */ void PreOrderTraverse(PBiTree T) { if (T == NULL) { return; } Stack nStack = {0,T->elem); T = T->LChild; if (NULL == T && nStack.top != 0) { T = nStack.BElem[-- nStack.top]; } } } /** 中序遍历 * 根 先入栈, * */ void InOrderTraverse(PBiTree T) { if (T == NULL) { return; } Stack nStack = {0,T->elem); } else { break; } T = T->RChild; } } }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。