把二叉树的叶子节点连成一个二叉链表
例如,输入如下的二叉树
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);
}