把二叉树的叶子节点连成一个二叉链表

时间:2022-04-15 17:31:54

把二叉树的叶子节点连成一个二叉链表

例如,输入如下的二叉树
1
/ \
2 3
/ \ \
4 5 6
/ \ / \
7 8 9 10


生成的二叉链表如下
7<->8<->5<->9<->10

解法:用递归的方法。

           前续遍历二叉树,把遍历过程中的叶子节点连起来,就可以了。

           具体解法如下:

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
#include <string.h>
#include <set>


#include <stdio.h>
#include <stdlib.h>

#define INT_MIN -100
#define INT_MAX 100

struct Node{
int key; Node* left; Node* right;
Node(int k, Node* l, Node* r): key(k), left(l), right(r){};
};


void createDLL(Node* root, Node** prev)
{
if(root)
{
createDLL(root->left, prev);

if( (root->left == NULL) && (root->right ==NULL) )
{
if( *prev != NULL)
{
(*prev)->right = root;
root->left = *prev;
}

*prev = root;

return;
}

createDLL(root->right, prev);
}
}

void printDLL(Node* head)
{
if(head)
{
cout<<head->key;
printDLL(head->right);
}
}

Node* findHead(Node* root)
//找到二叉树的前序遍历的第一个*叶子*节点,这个节点就是二叉链表的头结点。
{
while(1)
{
if(root->left)
root = root->left;
else if(root->right)
root = root->right;
else
break;
}
return root;
}


void printTree(Node* root)
{
if(root==NULL)
return;

cout<<root->key<<" ";
printTree(root->left);
printTree(root->right);
}

int main()
{
Node* n1 = new Node(1,NULL,NULL);
Node* n3 = new Node(3,NULL,NULL);
Node* n2 = new Node(2,n1,n3);
Node* n5 = new Node(5,NULL,NULL);
Node* n4 = new Node(4,n2,n5);
/* Constructed binary tree is
4
/ \
2 5
/ \
1 3 */

printTree(n4);
Node* head = findHead(n4);

Node** prev = new Node* (NULL);
createDLL(n4, prev);
printDLL(head);

}


相关文章