判斷一棵二叉樹的括號表示法是否是合法的

2021-10-01 05:57:47 字數 2083 閱讀 5106

最近在做資料結構作業時碰到這樣乙個問題:如何判斷一顆二叉樹的括號表示法是否合法。

例如:a(b,c(f,g,h),d,e(i,j))不是一棵二叉樹

a(c(f,g),e(i,j))是一顆二叉樹

a(bj,c(f,g,h),d,e(i,))表示式非法

(b,de(i,j))表示式非法

a(c(f,)h),e(i,j))表示式非法

我個人認為這個問題比二叉樹的遍歷之類的問題更有意思一些。思路其實也很簡單,用堆疊即可實現。下面說說一種非遞迴的具體思路:

(1)掃瞄表示式,遇到『(』『,』或者節點字元則將其入棧

(2)遇到『)』則將當前子節點處理,出棧,並判斷是否合法

具體演算法實現如下(非遞迴):

#pragma once

#define maxsize 100

struct stack//棧的定義

;bool

push

(stack *

&s,char e)

;bool

pop(stack *

&s,char

&e);

bool

gettop

(stack *s,

char

&e);

bool

isletter

(char a)

;

// tree.cpp : 此檔案包含 "main" 函式。程式執行將在此處開始並結束。

//#include

"pch.h"

#include

#include

using

namespace std;

bool

push

(stack *

&s,char e)

bool

pop(stack *

&s,char

&e)bool

gettop

(stack *s,

char

&e)bool

isletter

(char a)

bool

expiscorrect

(string exp)

elseif(

isletter

(e))

else

return

false;}

else

//若為逗號

return

false;}

else

return

false;}

else

if(e ==

',')

else

return

false;}

else

if(e ==

'(')

else

return

false;}

else

break

;case

',':

push

(op, exp[i]);

break

;default

:push

(op, exp[i]);

break;}

} i++;}

if(op-

>top ==0&&

isletter

(op-

>data[0]

))//處理結束,棧中只剩根節點

return

true

;return

false;}

intmain()

將文章開頭的表示式作為檢測資料輸入,驗證演算法正確性。

隨緣寫一些學習之路上的文章

判斷一棵二叉樹是否為平衡二叉樹

1.先給出樹節點資訊 typedef struct treetree,bitree 2.原理 判斷一棵樹是否為平衡二叉樹,要滿足每個節點的左右子樹的高度之差的絕對值不大於1。因此,我們這裡可以比較每個節點的左右字數高度,判斷他們差的絕對值是否滿足平衡二叉樹的條件即可 3.演算法 求二叉樹高度演算法 ...

判斷一棵二叉樹是否是完全二叉樹

層次遍歷乙個二叉樹,掃瞄到某個結點左孩子或右孩子為空時即停止,檢查此時佇列內所有結點是否均為葉子結點 include include define false 0 define true 1typedef int status typedef int elemtype typedef struct ...

判斷一棵二叉樹是否是平衡二叉樹

思路 遞迴方式判斷,返回的資訊應該有兩個 1 這棵樹是否是平衡的 2 這棵樹的高度為多少 public class isbalancedtree public static class returndata public static returndata process node head ret...