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

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

例如,输入如下的二叉树
        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);

}


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值