将二叉树的叶子结点转换成单链表,并返回最左叶子结点的地址(链头)

来源:互联网 发布:网易云课堂mac电脑版 编辑:程序博客网 时间:2024/04/30 02:42

已知二叉树的链表存储结构定义为如下:

typedef struct BinTNode
{
int data;
BinTNode *lchild;
BinTNode *rchild;


BinTNode(int elemet = 0, BinTNode *left = NULL, BinTNode *right = NULL)
:data(elemet), lchild(left), rchild(right){}
}BinTNode;


编写一个递归算法,利用叶子结点中空的 右连接指针域rchild,将所有叶子结点自左向右链接成一个单链表,算法返回最左叶子结点的地址(链头)。


算法分析:可以根据二叉树的先序遍历的方法,“根左右”!

#include "stdafx.h"#include <iostream>using namespace std;typedef struct BinTNode{int data;BinTNode *lchild;BinTNode *rchild;BinTNode(int elemet = 0, BinTNode *left = NULL, BinTNode *right = NULL):data(elemet), lchild(left), rchild(right){}}BinTNode;//递归创建二叉树BinTNode *CreateBinTree(int arr[], int begin, int end){BinTNode *root = NULL;if (begin >= end)return root;root = new BinTNode(arr[begin]);root->lchild = CreateBinTree(arr, begin * 2 + 1, end);root->rchild = CreateBinTree(arr, begin * 2 + 2, end);return root;}//函数功能:递归,利用叶子结点中空的右指针域rchild,//将所有叶子结点自左向右连接成一个单链表,返回最左叶子结点的地址BinTNode *head = NULL;BinTNode *temp = NULL;void ChangleToSingleList(BinTNode *root){if (NULL == root)//树为空return ;//叶子结点if (root->lchild == NULL && root->rchild == NULL){if(NULL == temp){temp = head = root;}else{temp->rchild = root;temp = root;}}ChangleToSingleList(root->lchild);//左子树ChangleToSingleList(root->rchild);//右子树}int main(){const int N = 10;int arr[N];for (int i = 0; i < N; i++)arr[i] = i + 1;BinTNode *root =  CreateBinTree(arr, 0, N);ChangleToSingleList(root);while (head != NULL){cout<<head->data<<" ";head = head->rchild;}cout<<endl;}