如何将二叉树的所有叶子结点链接成链表,使用原来的二叉树的右指针充当链表的next指针,确定不点进来看看???

  • 二叉树的结构
typedef struct Node{
	int data;
	char ch;
	struct Node *lchild, *rchild;
}Tree;

1.层次遍历链接链表

Tree* changeLeavesDirction(Tree* tree)
{
	// 层次遍历,每当查看队列里的元素时,查看是否为叶结点(左右孩子是否为空),是叶结点就链接到pre后面,更新pre 
	Tree* head = (Tree*)malloc(sizeof(Tree));  // 链表头指针
	head->lchild = head->rchild = NULL;
	Tree* pre = head;  // 用来记录前驱,链接到哪里了
	 
	queue<Tree*> qu;
	qu.push(tree);
	
	while(!qu.empty()){
		// 获取当前层的长度 
		int len = qu.size();  
		for(int i=0;i<len;i++){    // 每次获取队顶元素 
			Tree* t = qu.front();
			bool flag = true;     // 记录当前结点是叶子结点 
			// 若当前结点不为叶子结点,标记为分支节点 
			if(t->lchild){
				qu.push(t->lchild);
				flag = false;
			}
			if(t->rchild){
				qu.push(t->rchild);
				flag = false;
			}
			
			if(flag){
				// 若为叶子结点,则将叶子结点加入链表中
				pre->rchild = t;
				pre = t;   // 更新前驱结点 
			}
			
			qu.pop();
		}
	}
	
	return head;
} 

2.非递归后序遍历来链接链表

Tree* changeLeavesDirction2(Tree* tree){
	
	Tree* head = (Tree*)malloc(sizeof(Tree));  // 链表的头指针
	head->lchild = head->rchild = NULL;
	Tree* pre = head;    // 记录链表的前驱
	
	Tree* p = tree;   
	Tree* r = NULL;      // 记录遍历树时的前驱  
	stack<Tree*> st;   // 存放后序遍历树的存储结构 
	// 非递归的后序遍历 
	while(p || !st.empty()){
		if(p){
			// 如果当前结点非空,就一直往左走 
			st.push(p);
			p = p->lchild;
		}else {
			// 获取栈顶元素 
			p = st.top();
			
			// 如果当前结点为叶结点,必须放到前面,因为后面会将 p赋值为NULL, 
			if(p->rchild==NULL && p->lchild==NULL){
				// 连接链表
				pre->rchild = p;
				pre = p; 
			} 
			
			// 如果栈顶元素右孩子非空,且右孩子没有被访问过,则访问右孩子 
			if(p->rchild && p->rchild!=r){
				p = p->rchild;
			}else {
				// 否则表明,右子树已经访问完,栈顶元素出栈 
				st.pop(); 
				// 记录前驱 
				r = p;
				// p指针为空,因为当前结点已经全部访问完毕,要找父节点 
				p = NULL; 
			}
		}
	}
	return head;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值