本文实例为大家分享了C语言非递归后序遍历二叉树的具体代码,供大家参考,具体内容如下
<>强法一:>强实现思路:一个栈先按根→右子树→左子树的顺序访问二叉树。访问时不输出。另一个栈存入前一个栈只进栈的结点。
最后输出后一个栈的结点数据。
# include# include typedef struct TreeNode { char元素; struct TreeNode *, *; * BTree}树; typedef struct StackNode { BTree数据; struct StackNode *下; * PStack}堆栈; typedef struct { PStack最高; * PLinkStack} LinkStack;//初始化空栈 PLinkStack Init_Stack (void) { PLinkStack年代; S=(PLinkStack) malloc (sizeof (LinkStack)); 如果(S) { 年代→高级=零; } 返回年代; }//压栈 空白Push_Stack (PLinkStack年代,BTree T) { PStack p; p=(PStack) malloc (sizeof(栈)); p→数据=https://www.yisu.com/zixun/T; p未来=S ->高级->; S ->高级=p; }//判空 int empty_Stack (PLinkStack S) { 如果(S ->上){ 返回0; 其他}{ 返回1; } }//出栈 PStack Pop_Stack (PLinkStack S) { PStack问; 如果(empty_Stack (S)) { 返回S ->最高; 其他}{ q=S ->高级; S ->高级=S ->高级->下一个; } 返回问; }//销毁栈 空白DestroyStack (PLinkStack S) { PStack del; 而(S ->高级!=NULL) { 德尔=S ->高级; S ->高级=S ->高级->下一个; 自由(del); } 自由(S); } BTree BuildTree (void) { char ch; BTree节点; ch=获取字符(); 如果(ch==' # ') { 节点=零; 其他}{ 节点=(BTree) malloc (sizeof(树)); 节点→元素=ch; 节点→左=BuildTree (); 节点→右=BuildTree (); } 返回节点; } 空白NotRecursionPostOrder (BTree T) { PLinkStack年代,计算机科学; S=Init_Stack (); c=Init_Stack (); 而(T | | ! empty_Stack (S)) { 如果(T) { Push_Stack (S, T); Push_Stack (c T); T=T→正确; 其他}{ T=Pop_Stack (S)→数据; T=T→左; } } 而(CS→顶!=NULL) { printf (" % c, c→高级→→数据元素); CS→高级=c→高级→下; } DestroyStack (CS); } int主要(空白){ BTree T; T=BuildTree (); NotRecursionPostOrder (T); 返回0; }
<>强法二:>强实现思路。按先序遍历访问每一个结点。存入栈中,当为空时,就出立即栈(第一次出栈)。出栈后应该立即进栈,去访问进栈结点的右结点,这样可以保证先输出左,右结点,再输出根结点。二次进栈利用国旗标记。
# include# include typedef struct TreeNode { char元素; int国旗; struct TreeNode *, *; * BTree}树; typedef struct StackNode { BTree数据; struct StackNode *下; * PStack}堆栈; typedef struct { PStack最高; * PLinkStack} LinkStack;//初始化空栈 PLinkStack Init_Stack (void) { PLinkStack S=(PLinkStack) malloc (sizeof (LinkStack)); 如果(S) { 年代→高级=零; } 返回年代; }//压栈 空白Push_Stack (PLinkStack年代,BTree T) { PStack p; p=(PStack) malloc (sizeof(栈)); p→数据=https://www.yisu.com/zixun/T; p未来=S ->高级->; S ->高级=p; }//判空 int empty_Stack (PLinkStack S) { 如果(S ->上){ 返回0; } 其他{ 返回1; } }//出栈 PStack Pop_Stack (PLinkStack S) { PStack q=S ->高级; S ->高级=S ->高级->下一个; 返回问; } BTree BuildTree (void) { BTree t; char ch; ch=获取字符(); 如果(ch==' # ') { t=零; } 其他{ t=(BTree) malloc (sizeof(树)); t→元素=ch; t→左=BuildTree (); t→右=BuildTree (); } 返回t; } 空白DestroyStack (PLinkStack S) { PStack p; 而(S→) { p=S→顶; 自由(p); 年代→高级=S→高级→下; } } 空白NotRecursionPostOrder (BTree T) { PLinkStack年代; S=Init_Stack (); 而(T | | ! empty_Stack (S)) { 如果(T) { T→国旗=0; Push_Stack (S, T); T=T→左; } 其他{ T=Pop_Stack (S)→数据; 如果(T→标志==0){ T→标志=1; Push_Stack (S, T); T=T→正确; } 其他{ 如果(T→标志==1){ printf (" % c T→元素); T=零; } } } } DestroyStack(年代);//销毁栈 } int主要(空白){ BTree T; T=BuildTree (); NotRecursionPostOrder (T); 返回0; } C语言非递归后序遍历二叉树