`

后序线索二叉树的后序遍历

阅读更多
#include<stdio.h>
#include<malloc.h>
#include <iostream.h>
//线索三叉树
typedef enum PointerTag{Link,Thread}; 
typedef struct ThrNode
{
   int data;
   struct ThrNode *lchild;
   struct ThrNode *rchild;
   struct ThrNode *parent;
   PointerTag LTag,RTag;
   bool tag;
}thrnode;

thrnode* pre;
//构造三叉树
bool CreateThrTree(thrnode* &T,thrnode* p)
{   
	
	char ch;
	scanf("%c",&ch);
	if(ch=='m') 
	{
		T=NULL;
	}
	else
	{
		T=(thrnode*)malloc(sizeof(thrnode));
		T->data=ch;
		T->parent=p;
		T->LTag=Link;
		T->RTag=Link;
		T->tag=false;
		CreateThrTree(T->lchild,T);
		CreateThrTree(T->rchild,T);
	}

  return true;
}

//打印树
void PrintTree(thrnode* T)
{
  printf("%c",T->data);

}

// 建立线索
void InThreading(thrnode * p)
{
  if(p)
  {
     InThreading(p->lchild);
	 InThreading(p->rchild);
	 if(!p->lchild) 
	 {
	    p->lchild=pre;
	    p->LTag=Thread;
	 }
	 if(!pre->rchild)
	 {
	   pre->rchild=p;
	   pre->RTag=Thread;
	 }
    pre=p;
  }

}
//后序线索化
void PostOrderThreading(thrnode* &Thead)
{
   pre=Thead;
   InThreading(Thead->lchild);
   Thead->rchild=pre;
   Thead->RTag=Thread;
   if(!pre->rchild) 
   {
	   pre->rchild=Thead;
	   pre->RTag=Thread;
   }
  
}

//后序遍历
void PostOrderTraverse(thrnode* &T)
{
  thrnode *p=T->lchild; //p 指向根节点
  while(p!=T)
  {
	if(!p->lchild->tag && p->LTag==Link)
	{
	  while(p->LTag==Link) p=p->lchild;
    }
	if(!p->rchild->tag )
	{
    	if(p->RTag==Link) 
	  {
		  p=p->rchild; //带右子树
		 // cout<<(char)p->data;
	  }
	  else  //最左孩子无右子树 
	  {
		  PrintTree(p);
		  p->tag=true;
		//  cout<<(char)p->data;
		  while(p->RTag==Thread && p!=T)
		  {
		    p=p->rchild;
           if(p==T) break;  //节点是二叉树根,退出循环
		//	cout<<(char)p->data;
			PrintTree(p);
			p->tag=true;
            
		  }
		 if(p==T) break;  //节点是二叉树根,退出循环
	      p=p->parent;
		 
		  }//else...if
	}//endif
    
    if(p->LTag==Link && p->RTag==Link) //当前节点既有左孩子又有右孩子
		 {
	        if(p->lchild->tag && p->rchild->tag &&!p->tag) 
			{
		      PrintTree(p);
		      p->tag=true;
			  p=p->parent;
			}
			else if(!p->lchild->tag)
			{
			  p=p->lchild;
			}
			else
			{
			 p=p->rchild;
			
			}
		  }
		  else if(p->LTag==Link && p->RTag==Thread)//当前只有左孩子
		  {
			  if(p->lchild->tag)
			  {
		        PrintTree(p);
		     	p->tag=true;
				p=p->parent;
			  }
			  else
			  {
				  p=p->lchild;
			  
			  }
	
		  }
		  else if(p->RTag==Link && p->LTag==Thread) //当前只有右孩子
		  {
		    if(p->rchild->tag) 
			{
				PrintTree(p);
		    	p->tag=true;
				p=p->parent;
			     
			}
			else
			{
			  p=p->rchild;
			}
		  }
		 else
		  {
		    PrintTree(p);
			p->tag=true;
			p=p->rchild;
		  }
  }//end...while
  
}



//主函数
void main()
{
  thrnode *head=(thrnode*)malloc(sizeof(thrnode));
  head->data=0;
  head->parent=NULL;
  head->lchild=NULL;
  head->rchild=head;
  head->LTag=Link;
  head->RTag=Link;
  head->tag=false;
  if(CreateThrTree(head->lchild,head)) 
  {
	  PostOrderThreading(head);
	  PostOrderTraverse(head);
  }
}

 

2
0
分享到:
评论

相关推荐

    先序线索二叉树、中序线索二叉树和后序线索二叉树

    对先序线索二叉树、中序线索二叉树和后序线索二叉树进行了 C 语言实现,主要包括线索二叉树的建立和遍历过程。

    二叉树先中后序线索化及其遍历

    3. 后序遍历:后序遍历的顺序是左子树 -&gt; 右子树 -&gt; 根节点,后序线索化较为复杂,因为后继节点可能在当前节点的祖先中。线索化后,后序遍历可以避免使用递归或栈,直接按照线索找到下一个节点。 4. 线索化过程:...

    非递归前序,中序,后序遍历二叉树(优化算法).rar_nooneyh_二叉树 非递归_前序 中序 后序_树遍历算法_遍历二叉树

    对于二叉树的非递归遍历算法,除了优化栈空间使用之外,还有助于理解和实现其他数据结构,如线索二叉树,以及在实际问题中的应用,如序列化和反序列化二叉树。这些算法在面试中也经常被问到,是每个程序员应该掌握的...

    数据结构树和二叉树遍历二叉树和线索二叉树PPT学习教案.pptx

    本资源主要讲述了数据结构树和二叉树遍历的相关知识点,包括二叉树的基本概念、二叉树遍历的六种方案、先序、中序、后序遍历算法的实现、线索二叉树的概念等内容。 二叉树的基本概念 二叉树是一种特殊的树形结构,...

    二叉树的非递归遍历(含前序、中序和后序)

    二叉树的递归遍历算法非常好写。这个.cpp文件里是二叉树的非递归遍历!

    线索二叉树(中序、先序和后序及遍历)

    在后序线索二叉树中,每个节点的左线索指向其后序遍历的后继节点,右线索指向其父节点。对于非叶子节点,如果其右子树为空,右线索指向其父节点;如果其左子树为空且右子树不为空,右线索指向其后序遍历的第一个节点...

    二叉树的基本操作,包括前序、中序、后序遍历的递归和非递归算法

    本文将深入探讨二叉树的前序、中序、后序遍历的递归和非递归算法。 1. **前序遍历**: - **递归算法**:首先访问根节点,然后递归地对左子树进行前序遍历,最后对右子树进行前序遍历。伪代码如下: ``` function...

    线索二叉树的建立、删除、插入、恢复线索

    线索二叉树可以分为前序线索二叉树、中序线索二叉树和后序线索二叉树三种。在本文中,我们将讨论中序线索二叉树的建立、删除、插入和恢复线索。 一、线索二叉树的建立 线索二叉树的建立可以通过遍历二叉树并将每个...

    线索二叉树 算法 建立 输出等。。。

    2. 类型:线索二叉树分为两种类型:前序线索二叉树、中序线索二叉树和后序线索二叉树,分别对应不同顺序的遍历。 构建线索二叉树: 1. 初始化:在构建线索二叉树之前,首先需要对原始二叉树进行遍历,并为每个节点...

    遍历和线索二叉树c语言版

    线索二叉树的后序遍历通常比前序和中序遍历复杂,因为后继节点的信息不足以确定当前节点是否已被访问过。可以使用栈辅助实现,但不直接依赖线索。 在C语言中实现线索二叉树,我们需要定义一个结构体来表示节点,...

    二叉树的非递归建立,前序、中序、后序遍历

    关于数据结构实验的二叉树问题

    线索二叉树(数据结构课设)

    线索二叉树是一种特殊形式的二叉树,它在二叉链表的基础上增加了线索,用于在树中进行更高效的前序、中序和后序遍历。这种数据结构在计算机科学,尤其是数据结构课程中占有重要地位,因为它能有效地解决非递归遍历的...

    建立二叉树,并输出二叉树的先序,中序和后序遍历序列,以及二叉树的叶子数

    [问题描述] 建立二叉树,并输出二叉树的先序,中序和后序遍历序列,以及二叉树的叶子数。 [基本要求] 要求根据读取的元素建立二叉树,能输出各种遍历。 [实现提示] 可通过输入带空格的前序序列建立二叉链表。

    C++线索二叉树类实现

    线索二叉树是一种特殊的二叉树结构,它在二叉链表的基础上增加了线索,以便于在非递归情况下进行前序、中序和后序遍历。在C++中实现线索二叉树需要理解二叉树的基本概念以及链式存储结构。本文将深入探讨线索二叉树...

    数据结构课程设计线索二叉树

    3. 设计前序、中序、后序线索二叉树遍历算法。 4. 编写测试用例,验证各种操作的正确性。 线索二叉树的构建: 构建线索二叉树分为两个阶段:普通二叉树到线索二叉树的转换和线索化。在转换过程中,我们需要遍历...

    线索二叉树的建立,遍历(非递归,前,中,后序),删除.

    线索二叉树通过在空指针上添加线索,指示前驱或后继节点的位置,使得非递归的中序、先序和后序遍历变得可能。 首先,我们需要了解线索二叉树的基本结构。`Tree` 类定义了一个节点,包括一个整数值 `num` 和两个指向...

    线索二叉树的遍历

    线索二叉树的先序,中序,后序遍历完整代码,在vs2013下编译通过

    数据结构课件:第6章 树和二叉树2遍历二叉树和线索二叉树.pptx

    本节内容主要介绍了数据结构中的树和二叉树,特别是关于遍历二叉树和线索二叉树的概念及算法。首先,树是一种非线性的数据结构,由根节点、左子树和右子树组成。二叉树是特殊的树,每个节点最多有两个子节点,分为左...

    线索二叉树

    后序线索二叉树则是在遍历过程中记录最近访问过的父节点,以便在后序遍历中找到正确的路径。 在实现线索二叉树时,通常会用到两个辅助指针类型:TLEFT和TRIGHT,分别用于标识节点的左线索和右线索。同时,需要特别...

Global site tag (gtag.js) - Google Analytics