最近在做資料結構作業時碰到這樣乙個問題:如何判斷一顆二叉樹的括號表示法是否合法。
例如: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...