设计一个算法把二叉数的叶子结点按从左到右的顺序连成一个单链表,二叉树按ldchild-rchild方式存储,?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计一个算法把二叉数的叶子结点按从左到右的顺序连成一个单链表,二叉树按ldchild-rchild方式存储,?相关的知识,希望对你有一定的参考价值。

谁能给出我这数据结构的的程序段啊...

有些迷茫 想了好久...

lchild 和rchild 是左孩子和右孩子```

大家忙帮想想```

成功后+50```

最好是图文的形式```呵呵``有点类似毕业论文```````谢谢了```
设计一个算法把二叉数的叶子结点按从左到右的顺序连成一个单链表,二叉树按ldchild-rchild方式存储,链接时用叶结点的rchild域存放链指针```

这是原题````
---------------------------------------------------------
2楼的可以补充一下如何遍历不??
我感觉你的算法有点意思```可以具体实现吗?

建立头指针 h,和指向当前节点的指针 p = h;
按 先序 或 中序 遍历该2叉树.

当碰到叶子节点 c 时:
p->rchild = c;
p = c;

遍历结束,返回h
*****************************
struct Node
DateType date;
struct Node *lchild,*rchild
*h,*p;

main()

*h = (Node *)malloc(sizeof(Node));
*p = h;
Node *tree;
/*取得2叉树*/
...
/*遍历*/
PreOderTraverse(tree);
p = h->rchild;
free(h);
/*输出p*/
...


PreOrderTraverse(Node node)

if(node == null) return;
if(node->lchild == null && node->rchild == null)
p->rchild = node;
p = node;
return;

PreOrderTraverse(node->lchild)
PreOrderTraverse(node->rchild)
参考技术A 你的要求还挺多的,不想做作业啊。
InsertList(List *list)

GList->next=list;
list->next=NULL;

NodeToList(Node *node)

if(node->ldchild==NULL&&node->rdchild==NULL)
InsertList(node);
if(node->ldchild!=NULL)
NodeToList(node->ldchild);
if(node->rdchilde!=NULL)
NodeToList(node->rdchild);
return;

参考技术B 这问题听着像是线索二叉树,建议lz查查有关这个的相关材料~~

剑指Offer32-Ⅱ从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        
     //和上题的思路基本一致,通过Queue队列的FIFO特性,以及其中的API方法来完成广度遍历
     Queue<TreeNode> queue=new LinkedList<>();
     //创建中转队列,通过它来存储子树
     Queue<TreeNode> temp=new LinkedList<>();
     queue.offer(root);
      List<List<Integer>> totall=new ArrayList<List<Integer>>();
      //先处理边界情况
      if(root==null) return totall;
     while(!queue.isEmpty()){
     List<Integer> part =new ArrayList<Integer>();
     while(!queue.isEmpty()){
         //取出队列queue中的树,并打印其根节点值
         TreeNode node=queue.poll();
         part.add(node.val);
         //将取出的树的左右子树存到temp队列中
         if(node.left!=null) temp.offer(node.left);
         if(node.right!=null) temp.offer(node.right);
     }
     //此时queue中的所有元素已经都取出来了,所以将temp中的所有元素复制到queue队列中,注意此时不能用queue=temp,
     //因为这样只是将queue队列指向了temp队列指向的内存地址,后面将temp清空了,那么queue也就指向空了,
     //则程序直接结束。
     queue.addAll(temp);
     temp.clear();
     totall.add(part);
     }
return totall;
    }
}

 

以上是关于设计一个算法把二叉数的叶子结点按从左到右的顺序连成一个单链表,二叉树按ldchild-rchild方式存储,?的主要内容,如果未能解决你的问题,请参考以下文章

题解——二叉树哈夫曼编码的实现

《剑指offer》:[60]把二叉树打印成多行

Java 剑指offer(31)从上往下打印二叉树

从上往下打印出二叉树的每个结点,同一层的结点按照从左到右的顺序打印

剑指Offer32-Ⅱ从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。

SDUT 3346 数据结构实验之二叉树七:叶子问题