Day 4编程任务:前序遍历序列中如何找到第k个结点的值?

2026-04-11 22:272阅读0评论SEO资源
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计734个文字,预计阅读时间需要3分钟。

Day 4编程任务:前序遍历序列中如何找到第k个结点的值?

问题描述:假设使用二叉树采用二叉链表存储结构,设计一个算法,求前序遍历序列中第K个节点的节点值。

问题解决:如果对程序没有时间和空间上的要求,我们可以直接使用前序遍历二叉树,并记录遍历到的第K个节点。下面是具体的算法步骤:

Day 4编程任务:前序遍历序列中如何找到第k个结点的值?

1. 创建一个全局变量,用于记录当前遍历到的节点数。

2.定义一个递归函数,用于进行前序遍历。

3.在递归函数中,首先访问当前节点,并检查当前遍历到的节点数是否等于K。

4.如果等于K,则输出当前节点的值。

5.然后递归访问左子树和右子树。

具体代码如下:

python

class TreeNode: def __init__(self, val=0, left=None, right=None): self.val=val self.left=left self.right=right

def findKthNode(root, k): global count count=0 def preorder(node): nonlocal count if not node: return count +=1 if count==k: print(node.val) return preorder(node.left) preorder(node.right) preorder(root)

示例root=TreeNode(1)root.left=TreeNode(2)root.right=TreeNode(3)root.left.left=TreeNode(4)root.left.right=TreeNode(5)findKthNode(root, 3)

以上代码中,我们定义了一个二叉树节点类`TreeNode`,然后定义了一个`findKthNode`函数来找到前序遍历序列中的第K个节点。在递归函数`preorder`中,我们记录遍历到的节点数,并在找到第K个节点时输出其值。

问题描述

假设二叉树采用二叉链表存储结构,设计一个算法,求前序遍历序列中第K个结点的结点值。

问题解决

如果对程序没有时间和空间上的要求,处理前序遍历之类的问题我们一般采用递归的算法。

递归过程中计数:

静态局部变量 全局变量 引用参数

#include<stdio.h> #include<stdlib.h> #define OVERFLOW -2 #define OK 1 #define ERROR 0 typedef int Status; typedef char TElemType; typedef struct BiTNode { TElemType data; struct BiTNode *lchild,*rchild; }BiTNode,*BiTree; Status CreateBiTree(BiTree *T) { char ch; ch=getchar(); if(ch=='#') *T=NULL; else { (*T)=(BiTNode*)malloc(sizeof(BiTNode)); if(!*T) exit(OVERFLOW); (*T)->data=ch; CreateBiTree(&(*T)->lchild); CreateBiTree(&(*T)->rchild); } return OK; } Status PreOrderTraverse(BiTree T,Status (*visit)(TElemType e)) { if(T) { (*visit)(T->data); PreOrderTraverse(T->lchild,visit); PreOrderTraverse(T->rchild,visit); } else return OK; } Status visit(TElemType e) { printf("%c\t",e); return OK; } Status fun1(BiTree T,int k,BiTree *p) { static int n=0; if(T) { n++; if(n==k) { *p=T; } fun1(T->lchild,k,p); fun1(T->rchild,k,p); } if(T) printf("%c",T->data); else printf("NULL"); printf("%d\n",n); return k; } int main() { BiTree T,p; int k; printf("请输入一个二叉链表:"); CreateBiTree(&T); printf("先序遍历后的链表为:\n"); PreOrderTraverse(T,visit); printf("\n请输入k的值:\n"); scanf("%d",&k); fun1(T,k,&p); printf("第%d个结点的结点值为%c",k,p->data); return 0; }

本文共计734个文字,预计阅读时间需要3分钟。

Day 4编程任务:前序遍历序列中如何找到第k个结点的值?

问题描述:假设使用二叉树采用二叉链表存储结构,设计一个算法,求前序遍历序列中第K个节点的节点值。

问题解决:如果对程序没有时间和空间上的要求,我们可以直接使用前序遍历二叉树,并记录遍历到的第K个节点。下面是具体的算法步骤:

Day 4编程任务:前序遍历序列中如何找到第k个结点的值?

1. 创建一个全局变量,用于记录当前遍历到的节点数。

2.定义一个递归函数,用于进行前序遍历。

3.在递归函数中,首先访问当前节点,并检查当前遍历到的节点数是否等于K。

4.如果等于K,则输出当前节点的值。

5.然后递归访问左子树和右子树。

具体代码如下:

python

class TreeNode: def __init__(self, val=0, left=None, right=None): self.val=val self.left=left self.right=right

def findKthNode(root, k): global count count=0 def preorder(node): nonlocal count if not node: return count +=1 if count==k: print(node.val) return preorder(node.left) preorder(node.right) preorder(root)

示例root=TreeNode(1)root.left=TreeNode(2)root.right=TreeNode(3)root.left.left=TreeNode(4)root.left.right=TreeNode(5)findKthNode(root, 3)

以上代码中,我们定义了一个二叉树节点类`TreeNode`,然后定义了一个`findKthNode`函数来找到前序遍历序列中的第K个节点。在递归函数`preorder`中,我们记录遍历到的节点数,并在找到第K个节点时输出其值。

问题描述

假设二叉树采用二叉链表存储结构,设计一个算法,求前序遍历序列中第K个结点的结点值。

问题解决

如果对程序没有时间和空间上的要求,处理前序遍历之类的问题我们一般采用递归的算法。

递归过程中计数:

静态局部变量 全局变量 引用参数

#include<stdio.h> #include<stdlib.h> #define OVERFLOW -2 #define OK 1 #define ERROR 0 typedef int Status; typedef char TElemType; typedef struct BiTNode { TElemType data; struct BiTNode *lchild,*rchild; }BiTNode,*BiTree; Status CreateBiTree(BiTree *T) { char ch; ch=getchar(); if(ch=='#') *T=NULL; else { (*T)=(BiTNode*)malloc(sizeof(BiTNode)); if(!*T) exit(OVERFLOW); (*T)->data=ch; CreateBiTree(&(*T)->lchild); CreateBiTree(&(*T)->rchild); } return OK; } Status PreOrderTraverse(BiTree T,Status (*visit)(TElemType e)) { if(T) { (*visit)(T->data); PreOrderTraverse(T->lchild,visit); PreOrderTraverse(T->rchild,visit); } else return OK; } Status visit(TElemType e) { printf("%c\t",e); return OK; } Status fun1(BiTree T,int k,BiTree *p) { static int n=0; if(T) { n++; if(n==k) { *p=T; } fun1(T->lchild,k,p); fun1(T->rchild,k,p); } if(T) printf("%c",T->data); else printf("NULL"); printf("%d\n",n); return k; } int main() { BiTree T,p; int k; printf("请输入一个二叉链表:"); CreateBiTree(&T); printf("先序遍历后的链表为:\n"); PreOrderTraverse(T,visit); printf("\n请输入k的值:\n"); scanf("%d",&k); fun1(T,k,&p); printf("第%d个结点的结点值为%c",k,p->data); return 0; }